相关疑难解决方法(0)

Java如何:正确的GUI编码?

这个是一个很长的,下面是我的"主要"类,它拥有我的大多数UI逻辑和所有的听众等.无论如何你可以看到我把很多代码卡在一个类中,整个事情似乎难以理解但它确实有效.

  1. 我创建了GUI whit Netbeans GUI Editor的最终外观
  2. Nebeans生成的源代码为您提供了私有变量,允许您与添加到表单的所有组件进行交互.
  3. 我在记事本中打开了Java类,我删除了所有阻止我编辑Netbeans中生成的代码的注释,现在我可以根据自己的喜好编辑整个类.

我在一个单独的包中有一个单独的GUI类,我在我的initUI()函数中调用该类,然后从这里引用所有组件并编写将这些组件作为参数的方法,并为这些组件添加特定的监听器.我还引用方法setter/getters的每个GLOBAL变量而不是直接引用它们.正如您所看到的,函数列表正在堆积在initUI()中,而我甚至都不在那里.

我猜这甚至不是专业的方法,你能不能给我提供新手提示,例子和建议如何改进所有这些代码,因为即使这一切都有效,因为它应该是非常非常丑陋的看,有没有书籍教程解释如何编写更大的应用程序的方法.

即使我在这个GUI中途完成这个GUI我喜欢尝试,并且我被告知JavaFX对于使用Java GUI更好,而且你获得的代码更令人愉快,就像你在Java Swing中得到的那样但在另一方面,JavaFX有很多关于其尚未完全准备好使用的投票.

无论如何这里是我的代码:

package ept.controller;

import ept.view.EPTMain;
import ept.model.EPTEvent_Model;
import ept.model.EPTLocal_Model;
import ept.model.EPTModule_Model;
import java.awt.Font;
import java.awt.MouseInfo;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import javax.swing.DefaultListModel;
import javax.swing.JComboBox;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JList;
import javax.swing.JOptionPane;
import javax.swing.JProgressBar;


public class EPTIndex_Controler {

    public EPTIndex_Controler() {
        initUI();
    }

    //Globals
    protected String selectedTower = null;
    protected Integer selectedModules = 0;

    public void …
Run Code Online (Sandbox Code Playgroud)

java swing

3
推荐指数
1
解决办法
2123
查看次数

如何在列中显示饼图的图例?

我有一个有许多部分的PieChart,这个PieChart的图例呈现为一行.如何将图例渲染为两列?

java render legend jfreechart

3
推荐指数
1
解决办法
6140
查看次数

ActionListener在Java GUI App的控制器中是个好主意吗?

我不想尝试遵循MVC模式.在互联网上,我看到最着名的例子是计算器,例如这里.我开始使用这种MVC模式的实现.但是现在我对控制器中的动作监听器有些疑虑,因为它们倾向于查看.

有很多变化与视图相关的主要原因 - 字体,颜色,边框等.此外还有仅仅修改视图的actionlisteners!因此,在控制器中实现这样的actionlistener要困难得多(与视图中的简单内部匿名类相比).此外,它需要从控制器访问许多视图元素.

我有一个想法是在控制器和一些视图中保留一些actionlisteners,但它可能导致将来混乱.所以我想听听其他人的想法.

PS这个问题与许多ActionListenerMVC模式不重复

java model-view-controller swing design-patterns

3
推荐指数
1
解决办法
6126
查看次数

在一个JPanel上画的10个线程

我在学习Java中的线程时遇到了一些问题.目标是进行模拟,向我们展示兔子在某种类型的板上如何从狼群中奔跑.每只狼和每只兔子都应该成为一个线索.所以我在Test类的main方法中创建了一个GUI,并创建了一个实现Runnable接口的新类.我认为这很容易也很合乎逻辑.但是现在,我如何AddRabbit从这些线程调用该方法?因为非常线程应该像下面这样做:

  1. 更改其属性,如地图上的位置
  2. 检查地图上的其他线程
  3. 在面板上涂漆

但是怎么样?

java swing multithreading rendering jpanel

3
推荐指数
1
解决办法
143
查看次数

摇摆和观察者模式

我在大学的任务是使用观察者模式制作应用程序来通过主题(编程基础)。我想展示更多的知识,它包含在教学大纲中,但这对我来说适得其反。我用 Swing + sql 制作了一个应用程序,严重依赖 ActionListeners,我认为这是观察者模式的一个重要示例。不幸的是,我的项目被拒绝了,因为我没有编写自己的观察者模式实现。

我的问题是,是否有可能使用 Swing 来替换默认的操作侦听器?我什至无法检查其外部按钮的状态。我现在真的很困惑,尽管我知道模式的原理并寻求你的帮助。

java swing design-patterns

3
推荐指数
1
解决办法
2965
查看次数

Java Swing FocusListener的MVC实现

我正在尝试使用MVC架构模式构建一个简单的Java Swing应用程序.我所做的是在我的视图中创建用户界面组件(作为私有),并具有返回组件的公共方法.然后由控制器调用这些方法,通过它我可以为事件/动作侦听器编写方法.以下是一个示例示例:

视图:

private JButton btnAdd;

    public JButton getBtnAdd(){
        return btnAdd;
    }
Run Code Online (Sandbox Code Playgroud)

控制:

myGuiFrame gui = new myGuiFrame();


        //on add button clicked
    gui.getBtnAdd().addActionListener(new ActionListener() {
        @Override
        public void actionPerformed(ActionEvent e) {
            //calls to model
        }
    });
Run Code Online (Sandbox Code Playgroud)

这个实现是否正确?

如果是这样,那么我遇到了FocusListeners的问题.当我在视图中创建FocusListener时,会在视图中创建focusLost和focusGained方法.

private FocusListener l;

someComponent.addFocusListener(l);

        l = new FocusListener() {

            @Override
            public void focusLost(FocusEvent e) {
                // TODO Auto-generated method stub
            }

            @Override
            public void focusGained(FocusEvent e) {
                // TODO Auto-generated method stub

            }
        };
Run Code Online (Sandbox Code Playgroud)

我希望所有的事件处理程序都在我的控制器中.我的问题是......有没有办法可以从我的控制器调用/声明focusLost和focusGained方法?我试图将FocusListener定义为public,以便我可以在我的控制器中定义它:

视图:

public FocusListener l;
public someComponentType someComponent; …
Run Code Online (Sandbox Code Playgroud)

java model-view-controller swing focus listener

2
推荐指数
1
解决办法
1419
查看次数

带有匿名EventListener的JPanel - 为什么GC不会破坏监听器?

我一直在仔细阅读JMapViewer的开源代码.如果有其他人希望查看它,请检查SVN.

简而言之,主要类是JMapViewer,它是一个扩展JPanel.还有一种叫非常重要的一类DefaultMapController充当MouseListener主类.

我注意到的第一个奇怪的事情是观众没有对控制器的引用.该JMapViewer构造器实例的一个匿名实例DefaultMapController,就像这样:

public JMapViewer() {
    // other stuff
    new DefaultMapController(this);
}
Run Code Online (Sandbox Code Playgroud)

在我看来这是一个糟糕的设计选择,因为控制器有很多方法(选项,切换等 - 下面显示的例子),现在根本无法访问,那么它们有什么用呢?

public void setMovementMouseButton(int movementMouseButton) {
    // changes which mouse button is used to move the map
}
Run Code Online (Sandbox Code Playgroud)

控制器确实有一个对查看器的引用,如上面的第一个片段所示,这是它能够控制的方式.

然而,那时我想到的东西更怪异!如果这个监听器的匿名实例没有引用,为什么它甚至可以存活?GC不应该迅速摧毁它吗?或者GC是否足够聪明,知道引用live的侦听器类也JComponent必须保持活动才能正常工作,即使它因某些奇怪的原因没有名称?

那么,有两个真正的问题:

  • 为什么GC不会破坏对象?
  • 这确实是一个糟糕的设计选择,还是有一些方法我不知道从实例化查看器的类访问控制器?

我想为这个开源库做贡献,我改变的第一个想法是改变JMapViewer类以使一个字段引用其控制器,并更改构造函数以将当前的匿名控制器分配给这个新字​​段.但是,我想确保我不会无知地遗漏某些东西.我在整个代码库中搜索了文本DefaultMapController,它只出现在它自己的类定义中,以及JMapViewer构造函数中的匿名实例化中.


编辑:

确实有一种方法可以通过使用该java.awt.Component方法来访问匿名侦听器getMouseListeners().从技术上讲,在我的应用程序中,我可以搜索此集合的实例DefaultMapController,并使用它来访问我需要用来更改控制器选项的方法.

但是,为了扮演魔鬼的拥护者,如果我按照原始想法并给地图作为其控制器的参考,现在我有一种循环参考(地图知道控制器和控制器知道地图).这是一个坏主意吗?

java swing garbage-collection event-listener jmapviewer

2
推荐指数
1
解决办法
772
查看次数

JTree:为各个组设置自定义打开/关闭图标

  1. 我知道如何在JTree中设置自定义叶图标
  2. 我知道如何为所有组节点设置自定义关闭/打开图标

但我无法根据组节点名称设置自定义打开/关闭图标,例如节点可以称为电子邮件(因此有一个包络图标很好)或者一组可能被称为任务等等.

我试图通过重写getTreeCellRendererComponent类的方法来做到这一点DefaultTreeCellRenderer

但是改变icon当前的电流node只会影响下一个节点!

如何为各个组设置自定义打开/关闭图标?

请看一下我的代码:

Employee.java

package com.ehsunbehravesh.swing;

import java.util.Random;

public class Employee {

  public String name;
  public int id;
  public boolean isBoss;
  public Employee[] employees;

  public Employee(String name, boolean isBoss) {
    this.name = name;
    this.isBoss = isBoss;
    this.id = new Random(System.currentTimeMillis()).nextInt(Integer.MAX_VALUE);
  }  

  @Override
  public String toString() {
    return this.name;
  }

    static String randomName() {
    String chars = "abcdefghijklmnopqrstuvwxyz";
    StringBuilder builder = new StringBuilder();
    Random r = new Random(System.currentTimeMillis());
    int length …
Run Code Online (Sandbox Code Playgroud)

java icons swing jtree treecellrenderer

2
推荐指数
2
解决办法
1万
查看次数

Java Swing和观察者模式

我正在寻找一种在Swing中清晰地组织我的UI代码的方法.

假设我的UI代码按以下方式构建:

class MainWindow extends JFrame {
    // SomePanel panel is added here
}
class SomePanel extends JPanel {
    // buttons, checkboxes and so on are added here
}
Run Code Online (Sandbox Code Playgroud)

假设我在main方法中实例化一个MainWindow对象:

MainWindow frame = new MainWindow("I am an App");
Run Code Online (Sandbox Code Playgroud)

在main-method中监听按钮的ActionEvents(在SomePanel中声明,在MainWindow中声明)的最佳做法是什么?

非常感谢您的帮助!

java oop model-view-controller swing observer-pattern

2
推荐指数
1
解决办法
3273
查看次数

适用于大型项目的Java GUI架构

我想制作一个应用程序,它将作为多个服务器的接口.原因:在默认情况下提供的web iface(我们无法改变它)是我们想念的一些事情,很少有人可以做得更好,并且确保某些东西的自动化会使工作更容易.

我有什么:几乎完成的类与服务器应用程序的Web界面进行通信.

GUI描述:对于某种版本0.1:用户名的文本字段,选择服务器的单选按钮和一个"go"按钮.然后几个(4-12)操作按钮操作数据,2x文本区域与结果,一个标签与一些文本数据 - 我可以管理这个.然后我需要查看数据 - 网格MxN将加载数据,预期大小:7-15列,通常10行或更少,但很少它可以超过1k(甚至更多,但我不需要所有在这种情况下对用户可见).

我需要的是:只是一个建议.我希望从一个简单的版本开始(我已经开始研究它了,但是我坚持太多的事情 - 95%的cos和GUI的全新,5%的cos我是java的新手).我检查了很多教程,但它们都很简单.


真正的问题:

1)验证.在MVC控制器中应该处理所有用户操作 - 它是通过view的方法完成的,类似于button.addActionListener(param); anotherButton.addActionListener(paramp; ...?

1b)我已经看到所有通过一个(嵌套)类实现,然后检查源或smth - 是吗?会有很多按钮等.

2)如何实现数据网格,当我需要对click/dbl点击进行操作时?

4)第一行是标题,其余的应该是可滚动的 - 如果它在网格中或在外面(它自己的网格):

4a)如何确保标题的大小(宽度)与数据中的相同(我不想设置直接大小)

4b)到目前为止,我没有创建任何可滚动的东西,但我认为这很糟糕.如何确保标题将保留在某个位置,其余的可以滚动?

5)如何实施"数据更新"?我有JPanel从中删除网格组件,然后我创建新的并添加数据(简单,但perhapss有另一种方式).最初的改进之一是排序 - 使用与新内容相同的方式?


非常感谢任何答案,我知道这不是很具体,但我发现的例子太简单了.

我计划了很多增强功能,但未来的这些功能我并不介意多次重做GUI/Controller,至少我会练习,但我不想完成代码的一部分并意识到我必须重写一半的控制器和1/4的视图才能实现.

注意:我打算在工作中使用它作为我的工具(如果事情正确,我可以通过几次点击完成我工作的25-50%:-)所以我的意思是这个).

注意#2:我不是编程的新手,但我从来没有创建过GUI(这就是为什么我的菜单栏有2个项目和3个组件的GUI,几乎完成了web-iface连接).

注意#:3个可拖动数据标题,标签数据视图 - 这就是未来的计划:-)

java architecture user-interface swing

2
推荐指数
1
解决办法
360
查看次数