如何在常规jframe中使用多个jpanel

时间:2019-06-29 00:20:23

标签: java swing jframe jpanel

我将可视化聚类分析k均值的实现,为此,我使用了swing。存在一个问题,即添加的第二个jpanel(nodePanel)由于在集群中发生而未得到处理。

我尝试处理jframe和jpanel类,因为我知道不能在多线程级别上解决它,但是后来我很难实现这个想法。

public class MainUI extends JFrame {
    JPanel canvas;
    NodePanel nodePanel;
    ClusterPanel clusterPanel;
    public static boolean isPaintCluster;
    MainUI(String title) {
        super(title);
        setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
        init();
        super.setSize(700, 540);
        Dimension screen = Toolkit.getDefaultToolkit().getScreenSize();
        Dimension frm = super.getSize();
        int xpos = (int) (screen.getWidth() / 2 - frm.getWidth() / 2);
        int ypos = (int) (screen.getHeight() / 2 - frm.getWidth() / 2);
        super.setLocation(xpos, ypos);
        super.setVisible(true);
    }
    void init(){
        this.setLayout(null);
        canvas = new JPanel();
        nodePanel = new NodePanel();
        clusterPanel = new ClusterPanel();
        nodePanel.addMouseListener(new NodeClickListener(nodePanel));
     clusterPanel.addMouseListener(new ClusterClickListener(clusterPanel));
        canvas.setBackground(Color.white);
        canvas.setBounds(10,10,480,480);
        nodePanel.setBounds(10,10,480,480);
        clusterPanel.setBounds(10,10,480,480);
        this.add(canvas);
        this.add(clusterPanel);
        this.add(nodePanel);
        JPanel ButtonPanel = new JPanel();
        JRadioButton radioButtonNodes = new JRadioButton("add Nodes");
        radioButtonNodes.addActionListener(new isPaintNode());
        JRadioButton radioButtonCluster = new JRadioButton("add Clusters");
        radioButtonCluster.addActionListener(new isPaintCluster());
        ButtonPanel.setLayout(null);
        this.add(ButtonPanel);
        ButtonPanel.setBounds(500,10,180,480);
        ButtonPanel.add(radioButtonNodes);
        radioButtonNodes.setBounds(0,200,120,20);
        ButtonPanel.add(radioButtonCluster);
        radioButtonCluster.setBounds(0,230,120,20);
    }

    class isPaintCluster implements ActionListener {
        @Override
        public void actionPerformed(ActionEvent e) {
            if(isPaintCluster){isPaintCluster = false;}
            else {isPaintCluster = true;}
        }
    }
    class isPaintNode implements ActionListener {
        @Override
        public void actionPerformed(ActionEvent e) {
            if(isPaintNode){isPaintNode = false;}
            else {isPaintNode = true;}
        }
    }
}

我期望得到一个解决方案,其中群集和节点将作为端类独立,但是在应用程序的学习的每个步骤中,群集的位置将被重新定义,并且节点的颜色也将根据群集的颜色。

2 个答案:

答案 0 :(得分:0)

    canvas.setBounds(10,10,480,480);
    nodePanel.setBounds(10,10,480,480);
    clusterPanel.setBounds(10,10,480,480);
    this.add(canvas);
    this.add(clusterPanel);
    this.add(nodePanel);

Swing以相反的顺序绘制组件,将其添加到面板中。因此,先绘制nodePanel,再绘制clusterPanel,最后再绘制画布面板。

由于面板的位置和大小相同,因此,canvasPanel顶部的画布绘制和nodePanel顶部的画布绘制一样。因此,实际上您只会看到“画布”面板。

您可以尝试使用setOpaque( false )使所有面板变为非透明面板,但是我不推荐这种方法。

相反,我建议您应该只有一个面板,然后覆盖面板的paintComponent()方法以在面板上绘制多个对象。

请查看Custom Painting Approaches,以获取此方法的示例。

答案 1 :(得分:0)

除了将NodePanel和СlusterPanel类组合为一个将处理表单中添加的节点和群集的类之外,我没有想到更好的方法了。