开发者社区> 问答> 正文

将布局管理器与JPanel和Graphics 2D结合使用

我想在JPanel上绘制线条和更多内容,将其添加到JFrame并在之后使用.pack()。我的问题是在这种情况下,我不知道如何使用布局管理器。通常,我使用gridBagLayout向面板添加按钮或其他东西,我完全理解这一点。但是对于2D图形,我只是直接绘制到面板上。因此,我无法正确使用.pack()。有人知道如何以正确的方式pack()jPanel吗?我的代码如下所示:

public class NetworkViewPanel extends JPanel implements KeyListener, ActionListener {       
public NetworkViewPanel(NetworkAI network) {
    this.network = network;
    this.netList = network.getLayerList();
    addKeyListener(this);
    setFocusable(true);
    this.setLayout(new GridLayout(2, 2, 2, 2)); // does that even make sense ?

}

public void paint(Graphics g) {
    super.paint(g);
    g2 = (Graphics2D) g;


    if (showStandardView) {
        drawRectangles();
        drawLines();
    } else {
        drawRectangles();
        drawLinesSpecial(listIndex, xIndex);
    }
}

问题来源:Stack Overflow

展开
收起
montos 2020-03-22 15:52:44 723 0
1 条回答
写回答
取消 提交回答
  • 您可以JPanel使用布局管理器进行布局,并在其上方进行自定义绘制。 这不会阻止您使用pack()1。 以下mre 2 演示了JPanel使用绘制线条GridLayout:

    import java.awt.Color;
    import java.awt.Dimension;
    import java.awt.Graphics;
    import java.awt.GridLayout;
    import java.util.ArrayList;
    import java.util.List;
    import javax.swing.BorderFactory;
    import javax.swing.JFrame;
    import javax.swing.JLabel;
    import javax.swing.JPanel;
    
    public class NetworkViewPanel extends JPanel{
    
        private final List<JLabel> labels;
    
        public NetworkViewPanel() {
            this.setLayout(new GridLayout(2, 2, 2, 2));
            this.setPreferredSize(new Dimension(400,300));//used by pack()
            labels = new ArrayList<>();
            addLabels(new String[]{ "A", "B" , "C" , "D"});
        }
    
        private void addLabels(String[] text){
    
            for(String t: text){
                JLabel label = new JLabel(t);
                label.setBorder(BorderFactory.createLineBorder(Color.BLUE));
                label.setHorizontalAlignment(JLabel.CENTER);
                add(label);
                labels.add(label);
            }
        }
    
        @Override
        public void paintComponent(Graphics g) {
            super.paintComponent(g); //draw panel as layed out by layout manager
            drawLines(g);
        }
    
        private void drawLines(Graphics g) {
            //draw line between centers of first and last components
            int x1 = labels.get(0).getBounds().x + labels.get(0).getBounds().width /2;
            int y1 = labels.get(0).getBounds().y + labels.get(0).getBounds().height /2;
            int x2 = labels.get(labels.size()-1).getBounds().x + labels.get(labels.size()-1).getBounds().width/2;
            int y2 = labels.get(labels.size()-1).getBounds().y + labels.get(labels.size()-1).getBounds().height/2;
            g.setColor(Color.RED);
            g.drawLine(x1, y1, x2, y2);
        }
    
        public static void main(String[] args) {
    
            JFrame f = new JFrame();
            f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
            f.setLocationRelativeTo(null);
            f.add(new NetworkViewPanel());
            f.pack();
            f.setVisible(true);
        }
    }
    

    1 请参阅:.pack()的作用是什么? 2 在询问或回答时考虑发布信息

    回答来源:Stack Overflow

    2020-03-22 15:54:10
    赞同 展开评论 打赏
问答分类:
问答地址:
问答排行榜
最热
最新

相关电子书

更多
低代码开发师(初级)实战教程 立即下载
冬季实战营第三期:MySQL数据库进阶实战 立即下载
阿里巴巴DevOps 最佳实践手册 立即下载