图形正在被Swing组件切断

时间:2014-03-05 14:31:19

标签: java swing graphics jpanel

我正在尝试创建一个程序,用户可以输入3点的x和y值,然后绘制这3点。但是,文本字段和按钮(我认为)会导致图形被切断。

窗口类

import java.awt.FlowLayout;

import javax.swing.JFrame;
public class Window {
    public static void main(String[] args) {
        Points frame = new Points();
        frame.setSize(640, 480);
        frame.setResizable(false);
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setVisible(true);
        frame.setLayout(new FlowLayout());


        }
}

积分课

import javax.swing.*;
import java.awt.*;
import java.awt.event.*;

public class Points extends JFrame{
    private JTextField x1;
    private JTextField y1;
    private JTextField x2;
    private JTextField y2;
    private JTextField x3;
    private JTextField y3;
    private JButton button;
    private JLabel label;
    static int nx1=0, nx2=0, nx3=0, ny1=0,  ny2=0, ny3=0;


    public Points(){

        x1 = new JTextField("0", 2);
        y1 = new JTextField("0", 2);
        x2 = new JTextField("0", 2);
        y2 = new JTextField("0",2);
        x3 = new JTextField("0", 2);
        y3 = new JTextField("0", 2);
        button = new JButton("Submit");
        label = new JLabel();

        button.addActionListener(new ActionListener(){
            public void actionPerformed(ActionEvent e){
                String sx1=x1.getText();String sx2=x2.getText();String sx3 = x3.getText();
                String sy1 = y1.getText();String sy2 = y2.getText(); String sy3 = y3.getText();

                nx1 = Integer.parseInt(sx1);
                nx2 = Integer.parseInt(sx2);
                nx3 = Integer.parseInt(sx3);
                ny1 = Integer.parseInt(sy1);
                ny2 = Integer.parseInt(sy2);
                ny3 = Integer.parseInt(sy3);


            }
        });

        add(x1);
        add(y1);
        add(x2);
        add(y2);
        add(x3);
        add(y3);
        add(button);
        add(new Panel());

    }
}

小组类

import java.awt.*;

import javax.swing.*;

public class Panel extends JPanel{

    public void paint(Graphics g){
        System.out.println(Points.nx1);
        g.drawRect(Points.nx1, Points.ny1, 5,5);
        g.drawRect(Points.nx2, Points.ny2, 5,5);
        g.drawRect(Points.nx3, Points.ny3, 5,5);
        repaint();
    }
}

2 个答案:

答案 0 :(得分:2)

paintComponent(Graphics g)用于swing组件,并在构造函数本身内设置面板的布局。在添加完所有组件后调用setLayout方法。

答案 1 :(得分:2)

FlowLayout尊重添加到面板的所有组件的首选大小。

  1. 您的Panel类没有首选大小,因此默认为(10,10),因为默认情况下FlowLayout在每个组件添加到面板之前/之后有一个间隙或5个像素。因此,您需要覆盖Panel类的getPreferredSize()方法,以返回包含所有自定义绘制代码的相应维度。

  2. 自定义绘画是通过重写paintComponent()(而不是绘画)完成的,如上所述。

  3. 你永远不应该在绘画方法中调用repaint()。这将导致无限循环。

  4. 不要忘记在paintComponent()方法的顶部添加super.paintComponent(..)语句,以确保背景重新绘制。