【问题标题】:JAVA GUI, Want to make separate panelJAVA GUI,想制作单独的面板
【发布时间】:2020-12-16 17:25:26
【问题描述】:

我想在有 JTextField 和绘制函数的地方创建一个单独的面板。 所以我不希望彼此重叠。 我应该如何更改源代码以使其成为这样?

import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JTextField;

public class MyPanel extends JPanel implements ActionListener {
JTextField a, b, c;
double A, B, C;

public MyPanel() {
    a = new JTextField("1.0", 10);
    b = new JTextField("-5.0", 10);
    c = new JTextField("6.0", 10);
    add(a);
    add(b);
    add(c);
    JButton button = new JButton("DRAW");
    add(button);
    button.addActionListener(this);
}

protected void paintComponent(Graphics g) {
    super.paintComponent(g);
    Graphics2D g2 = (Graphics2D) g;
    g2.drawLine(0, 200, 400, 200);
    g2.drawLine(200, 0, 200, 400);
    g2.setPaint(Color.red);
    for (int i = -20; i<20; i++) {
        int x = i;
        int y = (int) (A * x * x - B * x + C);
        g2.fillOval(200+x-2, 200-(y-2), 4, 4);
    }
}

@Override
public void actionPerformed(ActionEvent e) {
    A = Double.parseDouble(a.getText());
    B = Double.parseDouble(b.getText());
    C = Double.parseDouble(c.getText());
    repaint();
}


public static void main(String[] args) {
    JFrame f = new JFrame();
    f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    f.add(new MyPanel());       
    f.setSize(500, 400);
    f.setVisible(true);
}
}

【问题讨论】:

    标签: java swing user-interface jframe jpanel


    【解决方案1】:

    不要在“MyPanel”类上绘图。

    相反,您的“MyPanel”类将只是两个子面板的容器。您将需要:

    1. 文本字段的 JPanel
    2. 用于自定义绘画的内部“绘图面板”。

    所以构造函数代码应该是这样的:

    setLayout( new BorderLayout() );
    
    JPanel top = new JPanel();
    top.add(textField1);
    ...
    add(top, BorderLayout.PAGE_START);
    
    add(new DrawingPanel(), BorderLayout.CENTER);
    

    那么你的 DrawingPanel 的内部类会是这样的:

    class DrawingPanel()
    {
        @Override
        protected void paintComponent(Graphics g)
        {
            ...
        }
    
        @Override
        public Dimension getPreferredSize()
        {
             return new Dimension(...);
        }
    }
    

    【讨论】:

    • 谢谢:) 但是我应该在 Dimension(...) 中写什么代码??
    • 1) 很高兴它有帮助。不要忘记通过单击复选标记(答案旁边)来“接受”答案,这样人们就知道问题已经解决了。请参阅:What should I do when someone answers my question 2) 每个 Swing 组件都应确定其首选大小。您指定组件的默认大小。鉴于您当前的绘画代码看起来像是在绘制大小为 400 的线条,请尝试 (400, 400) 开始。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-12-23
    • 2010-09-25
    • 1970-01-01
    • 1970-01-01
    • 2014-04-02
    • 1970-01-01
    相关资源
    最近更新 更多