VPL从java开始

时间:2015-11-12 21:57:07

标签: java swing jpanel awt

我正在尝试创建一个可以修改和希望的通用节点,但是我遇到了一些麻烦,因为我在Swing中的技能并不是那么好。

问题1:我似乎无法在同一个JFrame中获得两个Node / Jpanel。

较小的问题2:中风从JPanel边界切断(我是否应该建立一种出血,这样就不会发生?)

任何帮助都有帮助:)

public class SimpleGui {

    public SimpleGui() {
        JFrame frame = new JFrame();

        NodePanel panel = new NodePanel(3, 2);
        panel.setLayout(new javax.swing.SpringLayout());
        frame.add(panel);

        NodePanel panel2 = new NodePanel(3, 2);
        panel2.setLayout(new javax.swing.SpringLayout());
        frame.add(panel2);

        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setSize(300, 300);
        frame.setResizable(true);
        frame.setVisible(true);

        panel.setLocation(50, 50);
        panel2.setLocation(150, 150);
    }
}

添加到JFrame的通用节点/面板类:

public class NodePanel extends JPanel {

    private int x = 0, int y = 0;    
    private PortPanel inPortPanel;
    private PortPanel outPortPanel;    
    int iH;
    int oH;    
    private int width = 120;
    private int height = 30;    
    Graphics2D g2;

    public NodePanel(int input, int output) {

        inPortPanel = new PortPanel(input);
        this.add(inPortPanel);

        outPortPanel = new PortPanel(output);
        this.add(outPortPanel);

        setPreferredSize(calculateDimension());
    }

    public void paintComponent(Graphics g) {
        g2 = (Graphics2D) g;

        g2.setColor(Color.black);
        g2.setStroke(new BasicStroke(4));

        inPortPanel.setLocation(x, y + (height - iH) / 2);
        outPortPanel.setLocation(x + width, y + (height - oH) / 2);

        drawNode();
    }

    private void drawNode() {
        g2.drawRoundRect(x, y, width, height, 5, 5);
    }

    private Dimension calculateDimension() {

        iH = inPortPanel.getPreferredSize().height;
        int iW = inPortPanel.getPreferredSize().width;
        oH = outPortPanel.getPreferredSize().height;
        height = iH > oH ? iH + iW : oH + iW;

        return new Dimension(width, height);
    }
}

作为节点面板

的一部分的端口面板
public class PortPanel extends JPanel {

    int x = 0;
    int y = 0;
    int portWidth = 14;
    int portHeight = 14;
    int count = 0;
    int offset = 22;
    Graphics2D g2;

    public PortPanel(int i) {
        this.count = i;
        setPreferredSize(calculateDimensions());        
    }

    public void paintComponent(Graphics g) {
        g2 = (Graphics2D) g;
        g2.setColor(Color.black);
        drawPorts();
    }

    private void drawPorts() {
        for (int i = 0; i < count; i++) {
            g2.fillOval(x, y + (i * offset), portWidth, portHeight);
        }
    }

    private Dimension calculateDimensions(){
        int overallHeight = (offset * (count-1)) + portHeight;
        return new Dimension(portWidth,overallHeight);
    }
}

1 个答案:

答案 0 :(得分:1)

  • 节点应该是逻辑类,而不是GUI组件类。
  • 您应该有一个可以绘制逻辑实体的所有可视化表示的绘图JPanel。
  • 这样,模型可以容纳多个逻辑实体,所有逻辑实体都可以由单个绘图JPanel绘制,而不必担心布局管理器。
  • 不要忘记在其覆盖方法中调用您的JPanel的super.paintComponent方法,以便您的JPanel可以做家务绘画。
  • 避免提供JPanels Graphics或Graphics2D字段,因为这会增加代码抛出NPE的风险。使用给予paintComponent方法的Graphics对象,如果需要在paintComponent调用的另一个方法中使用它,传递给该方法。