我正在尝试创建一个程序,用户可以输入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();
}
}
答案 0 :(得分:2)
将paintComponent(Graphics g)
用于swing组件,并在构造函数本身内设置面板的布局。在添加完所有组件后调用setLayout
方法。
答案 1 :(得分:2)
FlowLayout尊重添加到面板的所有组件的首选大小。
您的Panel类没有首选大小,因此默认为(10,10),因为默认情况下FlowLayout在每个组件添加到面板之前/之后有一个间隙或5个像素。因此,您需要覆盖Panel类的getPreferredSize()
方法,以返回包含所有自定义绘制代码的相应维度。
自定义绘画是通过重写paintComponent()(而不是绘画)完成的,如上所述。
你永远不应该在绘画方法中调用repaint()。这将导致无限循环。
不要忘记在paintComponent()方法的顶部添加super.paintComponent(..)语句,以确保背景重新绘制。