我试图在同一个jframe中有一个文本字段和图形,但它无法正常工作。我希望将文本字段放在底部,而将jframe的其余部分放在图形中,而当我运行它时,文本字段很奇怪,并覆盖整个区域。有谁知道我怎么能让它按照我想要的方式工作?
package pack;
import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
public class gui extends JPanel implements Runnable{
Thread t = new Thread(this);
protected JTextField textField;
private final static String newline = "\n";
public int x;
public int y;
public static void main(String args[])
{
new gui();
new input();
}
public void input()
{
textField = new JTextField(20);
GridBagConstraints c = new GridBagConstraints();
c.gridwidth = GridBagConstraints.REMAINDER;
c.gridwidth = 500;
c.gridheight = 100;
c.fill = GridBagConstraints.HORIZONTAL;
add(textField, c);
c.fill = GridBagConstraints.BOTH;
c.weightx = 1.0;
c.weighty = 1.0;
}
public void actionPerformed(ActionEvent evt) {
String text = textField.getText();
textField.selectAll();
}
public gui()
{
textField = new JTextField(20);
JFrame f = new JFrame("lol");
System.out.println("::");
f.setTitle("Basic window");
f.setSize(500, 500);
f.setLocationRelativeTo(null);
f.add(this);
f.setVisible(true);
f.setFocusable(true);
f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
f.add(textField);
run();
}
public void run()
{
while(true)
{
try
{
t.sleep(10);
}
catch(Exception e){}
System.out.println(":D");
x++;
y++;
repaint();
}
}
public void paint (Graphics g)
{
g.setColor(Color.red);
}
}
答案 0 :(得分:2)
删除此课程并重新开始使用新课程。代码结构错误,类名错误,自定义绘图错误,使用Threads错误,new input()
没有做任何事情,你不应该使用Thread.sleep( ),你不应该覆盖paint(),你不应该在框架可见后添加一个组件到框架。
首先阅读Custom Painting上的Swing教程中的部分。在那里,您将找到一个工作示例,它将向您展示如何在进行自定义绘制时更好地构建您的类。使用此演示代码作为程序的起点,并对此工作代码进行更改(一次一个)。
然后您可以更改该代码并将JTextField添加到框架中。您还需要阅读Using Layout Managers
上的Swing教程,以了解BorderLayout
的工作原理。所以从简单的工作开始,然后添加额外的组件。不要一次尝试这一切。
答案 1 :(得分:1)
你正在以错误的方式做事。
JFrame
使用BorderLayout
并且您在中心添加了两个组件,因此只有最后一个组件可见。
您正在JTextField
以及JFrame
中添加JPanel
。不知道为什么?
使用BorderLayout.SOUTH
在南方添加JTextField
,不要将其添加到JPanel
,如下所示:
public gui() {
...
textField = new JTextField(20);
JFrame f = new JFrame("lol");
f.add(this);
f.add(textField, BorderLayout.SOUTH);
...
}
请再次阅读以下帖子。