我编写了一个程序,在jframe中将5张图片绘制到画布上。 我现在添加了一个jtextfield,以便用户可以使用actionlistener输入一个数字。
理想情况下,用户输入的数字应该会在新画布上生成该数量的图片。
问题是,我无法移除画布对象并添加一个新画布,上面有新的图片数量。
请帮助
public class TaxiFrame extends JFrame implements ActionListener {
private JLabel L1 = new JLabel("Number of Taxis:");
private JLabel L2 = new JLabel("Type an integer and press enter");
private JTextField t1 = new JTextField (" ");
public TaxiFrame() {
super("This is the Frame");
setSize(600, 400);
getContentPane().setBackground(Color.CYAN);
setDefaultCloseOperation(EXIT_ON_CLOSE);
setLayout(new BorderLayout(10, 10));
Random rx = new Random();
Random ry = new Random();
for(int i = 0; i < 5; i ++)
{
TaxiCanvas tax = new TaxiCanvas();
tax.setBounds(rx.nextInt(600 - 100), ry.nextInt(400 - 100), 100, 100);
add(tax);
}
JPanel p = new JPanel();
p.setOpaque(false);
p.add(L1);
getContentPane().
add("South", p);
p.setOpaque(false);
p.add(t1);
getContentPane().
add("South", p);
p.setOpaque(false);
p.add(L2);
getContentPane().
add("South", p);
setVisible(true);
t1.addActionListener(this);
}
public static void main(String[] args) {
new TaxiFrame();
}
public void actionPerformed(ActionEvent e)
{
if (e.getSource() == t1)
{
if(Integer.parseInt(t1.getText()) > 0)
{
getContentPane().removeAll();
TaxiCanvas tax = new TaxiCanvas();
add(tax);
}
}
}
}
非常感谢
出租车画布代码是
import java.awt.*;
import javax.swing.*;
public class TaxiCanvas extends JComponent
{
private Taxi taxi = new Taxi();
public void paint(Graphics g)
{
taxi.paint(g);
}
}
taxi code
import java.awt.*;
import javax.swing.*;
public class TaxiCanvas extends JComponent
{
private Taxi taxi = new Taxi();
public void paint(Graphics g)
{
taxi.paint(g);
}
}
答案 0 :(得分:2)
删除和添加组件时,您需要revalidate()
和repaint()
不要添加和删除容器,而应考虑使用“分层”容器的CardLayout
,并让您浏览它们。请参阅How to use CardLayout
不要覆盖paint
的{{1}}方法。而是覆盖JComponent
,并确保调用paintComponent
不要破坏油漆链,并可能留下油漆工件。
请勿使用此已弃用的super.paintComponent
方法。而是使用add("South", p);
在布局设置(非空)时,尝试add(p, BorderLayout.SOUTH)
将无法执行任何操作
您试图多次添加到“South”。每个职位只能持有一个部分
添加到tax.setBounds
时,如果您在添加时未指定位置,则会自动添加到BorderLayout
。因此,如果您尝试添加多个组件而未指定位置,则只会显示您添加的最后一个组件。
Swing应用程序应该在Event Dispatch Thread(EDT)上运行。您可以将代码包含在CENTER
main
中。详情请见Initial Threads
老实说,我不知道你的代码试图做什么,但请看下面的RadioDef评论,看看它对你来说是否意味着什么。
如果您想向SwingUtilities.invokeLater...
添加多个Taxi
个对象,请参阅this answer您可以使用TaxiCanvas
List
个Taxi
个对象的内容在paintComponent
方法中迭代它们。
答案 1 :(得分:0)
我实现了@peeskillet的许多建议,并且稍微清理了一下代码,这就是结果。
import javax.swing.*;
import java.awt.event.*;
import java.util.*;
import java.awt.*;
public class TaxiFrame
extends JFrame
implements ActionListener {
private JLabel label1 = new JLabel("Number of Taxis:");
private JLabel label2 = new JLabel("Type an integer and press enter");
private JTextField inputField = new JTextField(10);
private JPanel taxiPanel = new JPanel();
private Dimension tpSize = new Dimension(600, 400);
private Random rand = new Random();
public TaxiFrame() {
super("This is the Frame");
getContentPane().setBackground(Color.CYAN);
setDefaultCloseOperation(EXIT_ON_CLOSE);
setLayout(new BorderLayout(10, 10));
taxiPanel.setLayout(null);
taxiPanel.setOpaque(false);
taxiPanel.setPreferredSize(tpSize);
add(taxiPanel, BorderLayout.CENTER);
JPanel p = new JPanel();
p.setOpaque(false);
p.add(label1);
p.add(inputField);
p.add(label2);
add(p, BorderLayout.SOUTH);
inputField.addActionListener(this);
inputField.setText("5");
addNewTaxis(5);
pack();
setResizable(false);
setLocationRelativeTo(null);
setVisible(true);
}
private void addNewTaxis(int numTaxis) {
for(int i = 0; i < numTaxis; i++) {
addNewTaxi();
}
}
private void addNewTaxi() {
TaxiCanvas tc = new TaxiCanvas();
tc.setBounds(
rand.nextInt(tpSize.width - 100),
rand.nextInt(tpSize.height - 100),
100, 100
);
taxiPanel.add(tc);
}
@Override
public void actionPerformed(ActionEvent e) {
if(e.getSource() == inputField) {
int numTaxis = Integer.parseInt(inputField.getText());
if(numTaxis > 0) {
taxiPanel.removeAll();
addNewTaxis(numTaxis);
taxiPanel.revalidate();
repaint();
}
}
}
public static void main(String[] args) {
SwingUtilities.invokeLater(new Runnable() {
@Override
public void run() {
new TaxiFrame();
}
});
}
public static class TaxiCanvas
extends JComponent {
private Taxi taxi = new Taxi();
@Override
protected void paintComponent(Graphics g) {
super.paintComponent(g);
taxi.paint(g);
}
}
public static class Taxi {
public void paint(Graphics g) {
// drawing the car body
g.setColor(Color.yellow);
g.fillRect(0,10, 60, 15);
// drawing the wheels
g.setColor(Color.black);
g.fillOval(10, 20, 12, 12); // left wheel
g.fillOval(40, 20, 12, 12); // right wheel
int x[] = {10, 20, 40, 50}; // coordinate arrays for the
int y[] = {10, 0, 0, 10}; // car cabin
g.setColor(Color.yellow);
g.fillPolygon(x, y, 4); // drawing the cabin in yellow
g.setColor(Color.black);
g.drawString("20", 25, 22);
g.drawLine(0, 25, 60, 25);
}
}
}
请不要接受这个答案,我只想表明他们是好建议并展示工作代码。有很多与Swing相关的小错误,但代码仍有效。