gpt4 book ai didi

java - 如何在 JFrame 中显示不同的组件?

转载 作者:行者123 更新时间:2023-11-29 03:45:05 26 4
gpt4 key购买 nike

我是 Java AWT 的新手。我的问题标题对你来说一定很荒谬,对此感到抱歉。在我的应用程序中,我有三个按钮,它们在单击时显示不同的线程。现在我想在单击特定按钮时添加一个按钮或复选框或选择列表等。例如,如果我点击是按钮,它应该显示一个选择列表,类似的东西。我如何实现这样的目标?到目前为止,这是我的代码:

import java.awt.Button;

import java.awt.Dimension;
import java.awt.FlowLayout;
import java.awt.Frame;
import java.awt.Graphics;
import java.awt.GridLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.KeyAdapter;
import java.awt.event.KeyEvent;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;


public class AppWindow extends Frame implements ActionListener{
String keymsg = "Test message";
String mousemsg = "Nothing";
int mouseX=30, mouseY=30;
String msg;
public AppWindow(){
//addKeyListener(new MyKeyAdapter(this));
//addMouseListener(new MyMouseAdapter(this));
addWindowListener(new MyWindowAdapter());
}

public void paint(Graphics g){
g.drawString(msg, 150, 100);
}

//Here the window is created:

public static void main(String args[]){
AppWindow appwin = new AppWindow();

appwin.setSize(new Dimension(300,200));
appwin.setTitle("My first AWT Application");
appwin.setLayout(new FlowLayout(FlowLayout.LEFT));
appwin.setVisible(true);

Button yes,no,maybe;
yes = new Button("yes");
no = new Button("no");
maybe = new Button("maybe");

appwin.add(yes);
appwin.add(no);
appwin.add(maybe);

yes.addActionListener(appwin);
no.addActionListener(appwin);
maybe.addActionListener(appwin);


}

@Override
public void actionPerformed(ActionEvent ae) {
// TODO Auto-generated method stub
String str = ae.getActionCommand();
if(str.equals("yes")){
msg = "You pressed Yes";
}
if(str.equals("no")){
msg = "You pressed No";
}
if(str.equals("maybe")){
msg = "You pressed Maybe";
}

repaint();
}


}


class MyWindowAdapter extends WindowAdapter {
public void windowClosing(WindowEvent we){
System.exit(0);
}
}

最佳答案

描述你应该做什么的要点:

  • 正如其他人已经提到的,最好使用 Swing 而不是 AWT,因为 Swing 更高级。
  • 尽可能始终尝试在 JPanelJComponent,而不是 Painting 就在您的 JFrame 之上,通过覆盖 paintComponent(Graphics g)所说的方法JComponent/JPanel
  • 永远不要在 JFrame 上调用 setVisible(true),除非它是大小已经确定。所以一般来说,这必须是最后一次调用,在完成向 JFrame 添加组件后,JFrame 的大小已由 LayoutManager 实现。
  • 在你的 actionPerformed(...) 中,而不是写所有的 if
    语句 block
    ,你应该遵守if-else if语句
    block
    。与前者相比,这样做的好处是,在任何给定的情况下一次,只会触发一个事件,因此一旦上述条件成立满意,您不希望您的代码继续检查其他条件,这在一般情况下真的不是一个好的编程练习,恕我直言。
  • 最重要的事情:永远不要在 main 方法中调用 pack()/setVisible(...),这样的调用属于到事件调度线程,并且必须在同一时间完成。请阅读 Concurrency in Swing了解更多详情。

查看示例程序,以便更好地理解。

import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.BorderFactory;
import javax.swing.JButton;
import javax.swing.JComboBox;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.SwingUtilities;

public class ComponentExample
{
private CustomPanel drawingBoard;
private JPanel contentPane;
private JButton yesButton;
private JButton noButton;
private JButton maybeButton;
private JComboBox cbox;
private ActionListener buttonAction = new ActionListener()
{
@Override
public void actionPerformed(ActionEvent ae)
{
JButton button = (JButton) ae.getSource();

if (cbox.isShowing())
contentPane.remove(cbox);

if (button == yesButton)
{
drawingBoard.setText("You Pressed YES.");
contentPane.add(cbox, BorderLayout.PAGE_END);
}
else if (button == noButton)
drawingBoard.setText("You Pressed NO.");
else if (button == maybeButton)
drawingBoard.setText("You Pressed MAYBE.");

/*
* revalidate()/repaint() is needed
* when the JComponent is added or
* removed from the already
* visible Container.
*/
contentPane.revalidate();
contentPane.repaint();
}
};

public ComponentExample()
{
cbox = new JComboBox(
new String[]{"I GOT IT"
, "I STILL HAD DOUBT"});
}

private void displayGUI()
{
JFrame frame = new JFrame("Component Example");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

contentPane = new JPanel();
contentPane.setOpaque(true);
contentPane.setBackground(Color.DARK_GRAY);
contentPane.setBorder(BorderFactory.createEmptyBorder(5, 5, 5, 5));
contentPane.setLayout(new BorderLayout(5, 5));

JPanel buttonPanel = new JPanel();
buttonPanel.setOpaque(true);
buttonPanel.setBackground(Color.WHITE);

yesButton = new JButton("YES");
yesButton.addActionListener(buttonAction);
noButton = new JButton("NO");
noButton.addActionListener(buttonAction);
maybeButton = new JButton("MAY BE");
maybeButton.addActionListener(buttonAction);
buttonPanel.add(yesButton);
buttonPanel.add(noButton);
buttonPanel.add(maybeButton);

contentPane.add(buttonPanel, BorderLayout.PAGE_START);

drawingBoard = new CustomPanel();
contentPane.add(drawingBoard, BorderLayout.CENTER);

frame.setContentPane(contentPane);
frame.pack();
frame.setLocationByPlatform(true);
frame.setVisible(true);
}

public static void main(String... args)
{
SwingUtilities.invokeLater(new Runnable()
{
public void run()
{
new ComponentExample().displayGUI();
}
});
}
}

class CustomPanel extends JPanel
{
private String msg;

public CustomPanel()
{
msg = "";
setOpaque(true);
setBackground(Color.WHITE);
}

public void setText(String msg)
{
this.msg = msg;
repaint();
}

@Override
public Dimension getPreferredSize()
{
return (new Dimension(300, 300));
}

@Override
protected void paintComponent(Graphics g)
{
super.paintComponent(g);
g.drawString(msg, getWidth() / 3, getHeight() / 3);
}
}

关于java - 如何在 JFrame 中显示不同的组件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11348201/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com