Java 如何在窗口内移动3个按钮
在下面的代码中,我试图在单击左按钮时向左移动这三个按钮。当我点击它;目前没有发生任何事情。谁能向我解释一下我做错了什么?此外,由于某些原因,它已停止正确编译,我不确定为什么,但我相信这是因为我的代码中有一个错误,当您单击按钮时,试图使按钮向左移动。我不想让窗户动。只有窗口中的按钮。有人知道我做错了什么吗?你能解释一下吗Java 如何在窗口内移动3个按钮,java,swing,layout,jframe,jbutton,Java,Swing,Layout,Jframe,Jbutton,在下面的代码中,我试图在单击左按钮时向左移动这三个按钮。当我点击它;目前没有发生任何事情。谁能向我解释一下我做错了什么?此外,由于某些原因,它已停止正确编译,我不确定为什么,但我相信这是因为我的代码中有一个错误,当您单击按钮时,试图使按钮向左移动。我不想让窗户动。只有窗口中的按钮。有人知道我做错了什么吗?你能解释一下吗 import java.awt.*; import java.awt.event.ActionEvent; import java.awt.event.ActionListene
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;
public class Buttons extends JFrame {
//Control Definitions
JButton resetButton;
JButton leftButton;
JButton colorButton;
JPanel buttonPanel;
// Layout Definiton
eventHandle evt;
FlowLayout flt;
Point point; //to Hold Previous Window Position
Color color; //to Hold Previous Color
public Buttons() {
super("Buttons Window");
flt = new FlowLayout();//inialize the Flow Layout
buttonPanel = new JPanel(flt);
//inialize the buttonPanel With Flow Layout
//initialize buttons
resetButton = new JButton("Reset");
leftButton = new JButton("Left");
colorButton = new JButton("Blue");
evt = new eventHandle(); //initiate the eventhandle class
buttonPanel.add(leftButton); //add leftButton
buttonPanel.add(colorButton);//add colorButton
buttonPanel.add(resetButton);//add colorButton
getContentPane().add(buttonPanel);//buttonPanel
//add actionlistners
leftButton.addActionListener(evt);
colorButton.addActionListener(evt);
resetButton.addActionListener(evt);
setBounds(20, 120, 250, 70);
//following Initate the point with Center of Scren
point = new Point((Toolkit.getDefaultToolkit().
getScreenSize().width - getWidth()) / 2,
(Toolkit.getDefaultToolkit().getScreenSize().height
- getHeight()) / 2);
setLocation(point); //locates the window in center
color = buttonPanel.getBackground();//stores the initial color
setDefaultCloseOperation(EXIT_ON_CLOSE);
setVisible(true);
}
class eventHandle implements ActionListener { //Event Handler
public void actionPerformed(ActionEvent e) {
{
if (e.getSource() == leftButton) ///if its from leftButton
{
leftButton.setAlignmentX(Component.LEFT_ALIGNMENT);
colorButton.setAlignmentX(Component.LEFT_ALIGNMENT);
resetButton.setAlignmentX(Component.LEFT_ALIGNMENT);
//setLocation( (point.x -150), point.y);//shift the window 150 pixels left
} else if (e.getSource() == colorButton) {
buttonPanel.setBackground(color.BLUE);
//sets the backgorund to Blue
} else {
leftButton.setAlignmentX(Component.CENTER_ALIGNMENT);
//sets the location to previous location
colorButton.setAlignmentX(Component.CENTER_ALIGNMENT);
resetButton.setAlignmentX(Component.CENTER_ALIGNMENT);
}
}
}
}
public static void main(String[] args) {
Buttons buttonwindow = new Buttons();
}
}
它已停止编译,因为您删除了一个accolade,所以请在方法上方放置一个accolade“}”:
public static void main(String[] args)
代码应该编译。请反馈
编辑:
也可以像这样重写您的主要方法:
public static void main(String[] args) {
SwingUtilities.invokeLater(new Runnable() {
@Override
public void run() {
Buttons buttonwindow = new Buttons();
}
}
);
}
if (e.getSource() == leftButton) {
((FlowLayout)buttonPanel.getLayout()).setAlignment(FlowLayout.LEFT); //1
buttonPanel.revalidate(); //2
}
else if (e.getSource() == colorButton) {
buttonPanel.setBackground(color.BLUE);
}
else {
((FlowLayout)buttonPanel.getLayout()).setAlignment(FlowLayout.CENTER);
buttonPanel.revalidate();
}
Swing组件的每次使用都必须通过事件调度线程(缩写)完成,否则您可能会得到不需要的视觉效果。请参阅以获取解释
编辑^2:
要实现所需的行为,请按如下方式重写操作侦听器:
public static void main(String[] args) {
SwingUtilities.invokeLater(new Runnable() {
@Override
public void run() {
Buttons buttonwindow = new Buttons();
}
}
);
}
if (e.getSource() == leftButton) {
((FlowLayout)buttonPanel.getLayout()).setAlignment(FlowLayout.LEFT); //1
buttonPanel.revalidate(); //2
}
else if (e.getSource() == colorButton) {
buttonPanel.setBackground(color.BLUE);
}
else {
((FlowLayout)buttonPanel.getLayout()).setAlignment(FlowLayout.CENTER);
buttonPanel.revalidate();
}
对Swing组件视觉外观的任何更改都必须通过指定的布局管理器完成,在这种情况下,在第1行中
要查看更改,您必须通知Swing components布局管理器重新排列组件-在第2行中,该方法“通知”布局管理器重新计算新位置,并最终“通知”EDT将其绘制在屏幕上。它已停止编译,因为您删除了一个赞誉,所以请放置一个赞誉“}”就在方法上方:
public static void main(String[] args)
代码应该编译。请反馈
编辑:
也可以像这样重写您的主要方法:
public static void main(String[] args) {
SwingUtilities.invokeLater(new Runnable() {
@Override
public void run() {
Buttons buttonwindow = new Buttons();
}
}
);
}
if (e.getSource() == leftButton) {
((FlowLayout)buttonPanel.getLayout()).setAlignment(FlowLayout.LEFT); //1
buttonPanel.revalidate(); //2
}
else if (e.getSource() == colorButton) {
buttonPanel.setBackground(color.BLUE);
}
else {
((FlowLayout)buttonPanel.getLayout()).setAlignment(FlowLayout.CENTER);
buttonPanel.revalidate();
}
Swing组件的每次使用都必须通过事件调度线程(缩写)完成,否则您可能会得到不需要的视觉效果。请参阅以获取解释
编辑^2:
要实现所需的行为,请按如下方式重写操作侦听器:
public static void main(String[] args) {
SwingUtilities.invokeLater(new Runnable() {
@Override
public void run() {
Buttons buttonwindow = new Buttons();
}
}
);
}
if (e.getSource() == leftButton) {
((FlowLayout)buttonPanel.getLayout()).setAlignment(FlowLayout.LEFT); //1
buttonPanel.revalidate(); //2
}
else if (e.getSource() == colorButton) {
buttonPanel.setBackground(color.BLUE);
}
else {
((FlowLayout)buttonPanel.getLayout()).setAlignment(FlowLayout.CENTER);
buttonPanel.revalidate();
}
对Swing组件视觉外观的任何更改都必须通过指定的布局管理器完成,在这种情况下,在第1行中
要查看更改,必须通知Swing components布局管理器重新排列组件-在第2行中,该方法“通知”布局管理器重新计算新位置,并最终“通知”EDT将在屏幕上绘制它。您的代码不会编译,因为静态
main
方法出现在内部类eventHandle
中。只需将其移动到外部类按钮的类体中即可修复
由于类级别上有所有对象引用,因此可以使用以下方法进行按钮对齐,例如:
flt.setAlignment(FlowLayout.RIGHT);
buttonPanel.revalidate();
...
在这里,您正在调整FlowLayout
的布局对齐方式,并重新验证,以直观地反映面板上更新的更改。当静态main
方法出现在内部类eventHandle
中时,您的代码将无法编译。只需将其移动到外部类按钮的类体中即可修复
由于类级别上有所有对象引用,因此可以使用以下方法进行按钮对齐,例如:
flt.setAlignment(FlowLayout.RIGHT);
buttonPanel.revalidate();
...
此时,您正在调整FlowLayout的布局对齐方式,并重新验证,以直观地反映面板上更新的更改。您应该更新布局管理器,使组件向左或向右对齐。试着做一些类似的事情
((FlowLayout)getLayout()).setAlignment(FlowLayout.LEFT);
相反您应该更新布局管理器,使组件向左或向右对齐。试着做一些类似的事情
((FlowLayout)getLayout()).setAlignment(FlowLayout.LEFT);
相反您的代码不可读。请正确缩进。“在下面的代码中,当你点击左按钮时,我正试图将三个按钮移到左边。”为什么?@andrewhompson这是一个家庭作业。我本来会这样标记它的,但是系统说标签现在已经被弃用了,我们不应该把它添加到帖子中。此外,我的帖子被大量编辑,以发布额外的信息,比如我为什么要做某件事,所以我将其遗漏了。下面是完整的标签信息——这个标签已经过时,正在被删除。请不要将此标签添加到问题中。但是,如果不看问题是否需要清理,就不要删除它。你的代码是不可读的。请正确缩进。“在下面的代码中,当你点击左按钮时,我正试图将三个按钮移到左边。”为什么?@andrewhompson这是一个家庭作业。我本来会这样标记它的,但是系统说标签现在已经被弃用了,我们不应该把它添加到帖子中。此外,我的帖子被大量编辑,以发布额外的信息,比如我为什么要做某件事,所以我将其遗漏了。下面是完整的标签信息——这个标签已经过时,正在被删除。请不要将此标签添加到问题中。但是,如果不看问题看它是否需要清理,就不要删除它。你和Reimeus为我提供了修复程序所需的所有信息。我不确定授予绿色复选框的协议是什么。请给出建议?完全由您自行决定,简言之:“底线是接受您认为对您个人最有帮助的答案。”我已接受上述答案,同时投票给Reimeus,因为这个答案更完整。它包括修复编译失败所需的修复,以及帮助我根据需要移动按钮。您和Reimeus为我提供了修复程序所需的所有信息。我不确定授予绿色复选框的协议是什么。请给出建议?完全由您自行决定,简言之:“底线是接受您认为对您个人最有帮助的答案。”我已接受上述答案,同时投票给Reimeus,因为这个答案更完整。它包括修复编译失败所需的修复程序以及辅助的m