【问题标题】:extending JPanel and observable扩展 JPanel 和 observable
【发布时间】:2014-08-21 16:30:31
【问题描述】:

我是 Java 新手,我有一个问题。

我有一个扩展JPanel 的类。它包含一个JButton。如果我按下这个按钮,我希望另一个班级注意到这一点。通过这样做,我读到我必须使用Observer/Observable

唯一的问题是,我只能扩展一次。有什么建议吗?

两个类:

public class ControlsPanel extends JPanel{

    private JButton start;
    private JButton stop;
    private int animationSpeed = 5;
    private boolean startIsPressed;
    private CashRegistersPanel cr_panel;

    public ControlsPanel(final ParametersPanel panel) {

        start       = new JButton("Start");
        stop        = new JButton("Stop");

        start.setFont(new Font("Arial", Font.BOLD, 14));
        stop.setFont(new Font("Arial", Font.BOLD, 14));

        this.setLayout(null);
        this.setBackground(new Color(199,202,255));

        this.add(start);
        this.add(stop);

        start.setBounds(10, 10, 280, 30);
        stop.setBounds(10, 50, 280, 30);

        stop.setEnabled(false);

        start.addActionListener(new ActionListener() {

            @Override
            public void actionPerformed(ActionEvent arg0) {

            if (start.getText().equals("Start")) {
                start.setText("Pause");
                stop.setEnabled(true);
                startIsPressed = true;
            }

            }
        });

        //For the STOP BUTTON
        stop.addActionListener(new ActionListener() {

            @Override
            public void actionPerformed(ActionEvent e) {
                if (stop.isEnabled()) {
                    stop.setEnabled(false);
                    start.setText("Start");
                    startIsPressed = false;
                }
            }
        });
    }

    public boolean StartisPressed() {
        return startIsPressed;
    }
}

public class CashRegistersPanel extends JPanel{

    private Image img;
    private int amount;
    private ParametersPanel parametersPanel;
    private ControlsPanel controlsPanel;
    private boolean startIsPressed;
    private CashRegister register;


    private ArrayList<CashRegister> myRegister = new ArrayList<CashRegister>();

    public CashRegistersPanel(ParametersPanel parametersPanel, ControlsPanel controlPanel) {

        startIsPressed = controlsPanel.StartisPressed();
    }


    public void paintComponent(Graphics g) {
        if (startIsPressed) {
        Need to do the painting here
        }
        }
    }
}

【问题讨论】:

  • 你为什么要扩展JPanel?子类化 Swing 类应该用于添加行为,用于控制布局。
  • 我有一个 JFrame 类和两个 JPanel 类。在第一个 JPanel 类中,我有一个按钮。如果按下此按钮,我希望第二个 JPanel 画一个圆圈。
  • 使用PropertyChangeEvent,如图here

标签: java swing observable observers


【解决方案1】:

您应该将ActionListener 添加到您要监控的Jbutton

【讨论】:

  • 这行不通,因为是的,我可以将 ActionListener 添加到 JButton(我有),但是第二类中的 JPanel 无法查看按钮是否被按下。跨度>
  • 你可以在任何你想通知Jbutton被按下的类上调用一个方法。
【解决方案2】:

假设 MyPanel 扩展 JPanel,您可以在您的类中实现 ActionListener。然后就可以在按钮的ActionListener中传递MyPanel的对象了。

class MyPanel extends JPanel implements ActionListener {

    @Override
    public void actionPerformed(ActionEvent e) {
       // Your Drawing Code
    }
    //your other jpanel code
} 

创建自定义 JPanel 的对象

 MyPanel myPanel1;

现在您可以将 myPanel1 对象作为按钮的 ActionListener 传递。

button.addActionListener(myPanel1);

【讨论】:

  • 感谢您的回复。我有一个 ActionListener,如果我按下按钮,布尔值 isPressed 就会变为真。我希望我的第二堂课能注意到这种变化并用图形画一个圆圈。
  • 查看我的更新答案。如果您有任何问题,请告诉我。
  • 它似乎对我不起作用.. 等一下,让我粘贴一些我的代码和类。我真的被困在这里,希望你能帮助我
【解决方案3】:

不要扩展 JPanel,没有一个理由应该这样做。现在,如果您希望其他类注意到您应该使用控制器作为 MVC 模式的排序版本。

【讨论】:

  • 我已经上传了一些我的代码。谢谢,我会看看如何使用控制器
猜你喜欢
  • 2013-09-12
  • 2018-04-23
  • 2016-10-19
  • 1970-01-01
  • 1970-01-01
  • 2013-07-21
  • 2014-06-26
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多