【问题标题】:Updating graphics in JPanel when button is pressed按下按钮时更新 JPanel 中的图形
【发布时间】:2015-03-13 12:41:28
【问题描述】:

我的主类扩展了 JFrame 并有一个包含图形组件的 JPanel,之前我有以下代码:

    public class StartGUI extends JFrame implements ActionListener {

    public StartGUI {

    graphArea = new JPanel() {
        public void paintComponent(Graphics g) {
            super.paintComponent(g);
            drawNetwork(myNetwork, this, g);
                }
};

            add(graphArea);
        }

但是现在我希望将图形区域更改为仅在按下 JButton 后才显示,我将如何移动此 JPanel 以在 actionPerformed 方法中更新 drawNetwork?

public void actionPerformed(ActionEvent e) {
    if(e.getSource() == readButton) {
        graphArea = new JPanel() {
            public void paintComponent(Graphics g) {
                super.paintComponent(g);
                drawNetwork(myNetwork, this, g);

            }
        };
    }

上述方法似乎不起作用,我该如何解决这个问题?

【问题讨论】:

  • 你不能只创建 graphArea 并让它变得难以理解。在 actionPerformed() 中调用 graphArea.setVisible(true)
  • 不,因为这是我的代码的简化。真正的按钮会提示一个文件选择器,该选择器会更改显示的图形。

标签: java swing graphics jpanel


【解决方案1】:

据我从您的评论中了解到,您只需将模型 (myNetwork) 和视图 (graphArea) 分开即可。

创建并添加 graphArea 但是

        public void paintComponent(Graphics g) {
            super.paintComponent(g);
            if (myNetwork!=null) {
                drawNetwork(myNetwork, this, g);
            }
        }

网络最初是空的(或者它可能是一些 isInitialized() 检查)。选择文件并创建网络后,只需调用 graphArea .repaint() 即可反映模型更改。

【讨论】:

    【解决方案2】:

    您创建了新的 graphArea JPanel,但不要将其添加到任何容器中。在您的旧代码中,您有一个呼叫 add(graphArea);,而新代码中缺少该呼叫。

    【讨论】:

    • 不幸的是这不起作用,我真的希望能够简单地更新paintComponent而无需每次都创建新的JPanel
    • 您不必每次都创建新面板。事实上,你不应该。只需将引用保留为类中的字段并在侦听器中使用即可。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-03-17
    • 2021-07-31
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多