Java Swing:简单的任务,但我失败了

时间:2017-05-07 19:02:55

标签: java swing tree

我不是Java和OOP的新手,但我是新手。

我想写一个用于构建血统书的软件。这意味着:右键单击绘图区域的中间并选择" New - >曼&#34 ;.在我右键单击的位置出现一个矩形。然后我点击矩形并选择"新 - >兄弟姐妹 - >女人"并且谱系使用连接到矩形的圆圈动态扩展。你明白了。

此外,我需要为谱系的每个节点保存信息。例如基因x中的突变:阳性"。

我认为这对于OOP来说一定是完美的。我需要我的血统的每个节点都是一个将自己吸引到绘图区域的实例。那么......一个Jpanel?我扩展了JPanel,我为该类赋予了一些属性(例如" int mutationX = 1")以及将自身添加到JFrame的方法。目前我只想通过菜单在屏幕中间添加一个矩形。摇摆初学者的简单步骤。但是所需的矩形并没有显示出来。基本上我的问题是:

  1. 我是否按照正确的方法解决了我想要实现的目标?
  2. 为什么矩形不显示?
  3. import javax.swing.*;
    import java.awt.*;
    import java.awt.event.*;
    
    public class HelloWorld
    {
        public static void main(String[] args)
        {
            JFrame frame = new JFrame("Hello World");
    
            JPanel mainpanel = new JPanel();
    
            JScrollPane scroll = new JScrollPane(mainpanel);
    
            frame.add(scroll);
    
            JMenuBar menubar = new JMenuBar();
            frame.setJMenuBar(menubar);
    
            JMenu file = new JMenu("File");
            menubar.add(file);
    
            JMenuItem exit = new JMenuItem("Exit");
            exit.addActionListener(
                    new ActionListener(){
                        public void actionPerformed(ActionEvent ae){
                            System.exit(0);
                        }
                    }
            );
    
            file.add(exit);
    
            JMenuItem newMember = new JMenuItem("Add");
            newMember.addActionListener(
                    new ActionListener(){
                        public void actionPerformed(ActionEvent ae){
                            FamilyMember fm = new FamilyMember();
                            mainpanel.add(fm);
                            mainpanel.revalidate();
                        }
                    }
            );
            file.add(newMember);
    
            frame.setLocation(400, 100);
            frame.setPreferredSize(new Dimension(500,500));
            frame.pack();
            frame.setVisible(true);
        }
    }
    
        public class FamilyMember extends JPanel {
    
        @Override
        protected void paintComponent(Graphics g){
            super.paintComponent(g);
            g.drawRect(230,80,10,10);  
            g.setColor(Color.RED);  
            g.fillRect(230,80,10,10);
        }
    
        @Override
        public Dimension getPreferredSize() {
            return new Dimension(50, 50);
          }
    
    
    }
    

1 个答案:

答案 0 :(得分:0)

对于第二点(为什么,最小值,它不起作用/显示任何矩形),您可以查看Oracle文档(从更精确到更广泛的关注):

简而言之,

你的JPanel实例mainpanel有一个FlowLayout作为布局管理器(这是新实例的默认值)

流程布局将使用每个孩子的首选大小

并强制将FamilyMember的首选尺寸强制为50x50

但是你只想在230,80的东南​​方向绘制,而不是在50x50区域。

=>它不会显示。

首先,我先说:将模型与视图分开。