JRE版本1.7更新3
预期的行为
当我运行该程序时,它按预期工作,一切顺利.当我点击STOP JButton动画停止并且同一文本JButton改变为START.现在当我点击时BALL COLOUR JButton,BALL变化的颜色以及变化的颜色BALL COLOUR JBUTTON也会变化BALL.如果我按原样运行我的应用程序而不调整大小,则整个行为都有效.
意外行为
但当RESIZE我JFrame通过拉动时Right Side,那就是当我的应用程序的意外行为被显示时,在某种意义上说,如果我按下STOP JButton然后单击BALL COLOUR按钮,JButton之前单击的文本更改为的文本START将STOP在不应该更改时再次更改为当它应该改变为球的颜色时,以及BALL COLOUR JButton将保持不变或将转向BLUE的颜色.我附上照片了解更多信息.但是如果你试图将它重新调整到原来的大小或更接近它,那么事情就会恢复正常.为什么会这样?任何想法或线索将非常感激.
正如我的应用程序运行如上所述的预期行为:

这里是意想不到的行为

底线:
为什么应用程序像往常一样运行BEGINNING,而不是RESIZED通过拖动它RIGHT SIDE,但是如果你把它带到它的原始大小或更接近它,事情恢复正常,它按预期工作?
所以考虑到这个场景,我在程序中做错了什么.或者这正是我应该使用的情况SwingWorker,或者这是一个问题Layout,或隐藏的相关内容Content Pane.请放轻装:-)
这是我正在使用的代码,我把它降到最低限度,因为我想要证明我的问题:
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
public class …Run Code Online (Sandbox Code Playgroud) 我正在构建我的第一个Swing应用程序,并试图找出我的JDialogs - 当用户选择JMenuItem时专门调用 - 可以更新JFrame的主客户区域中的组件,这是整个应用程序的父"窗口" .
这是我提出的设计,但不知道它是否:(1)只是简单的坏,(2)不是标准(因此最好)的方式,或(3)如果我完全偏离基础这里.任何建议都非常感谢.
基本上,用户选择JMenuItem,它启动JDialog.用户与对话框中的组件交互,然后单击"完成".如果一切都有效,那么JDialog会关闭,我希望父窗口(一个JFrame)更新其状态(并最终波及其组件).
我的设计:
有一个AppStateController是JFrame子类(我的应用程序)的成员.然后我将创建一个AppStateChangeListener和AppStateChangeEventObject子类,以便每当对话框验证并关闭时,它都会触发一个AppStateChange事件.由于父JFrame是该事件的唯一注册侦听器,因此我可以定义一个处理程序来获取传递给它的事件.我会确保AppStateChangeEvent有足够的元数据来描述所有可能的更改.
从理论上讲,我喜欢这种方法:每次不同的事件发生时,它应该是干净的,并且没有"spaghetti"类型的多个控件调用.但是,我担心它可能有点矫枉过正.
最佳实践在这里有什么要求?我不是一个真正的GUI人!
通常需要根据另一个GUI对象的状态更改其他GUI对象的行为.例如,当按下按钮时,标签应更改其名称.但是,当我使用AbstractAction对象时,JButton myButton = new JButton(myButtonAction);我需要引用继承自AbstractAction的对象中的GUI对象.我应该只是在GUI中创建AbstractAction对象,然后将所有必要的GUI引用传递给AbstractAction对象,还是可以认为是坏样式?
为了使它更具体:
// AbstractAction
public class MyAction extends AbstractAction {
public MyAction(String name,
String description, Integer mnemonic, JLabel) {
super(name);
putValue(SHORT_DESCRIPTION, description);
putValue(MNEMONIC_KEY, mnemonic);
}
public void actionPerformed(ActionEvent e) {
// do something
}
}
}
public class GUI{
public Action myAction = null;
public GUI(){
JLabel label = new JLabel("text");
//This is not a good idea:
myAction = new MyAction("some text" , desc, new Integer(KeyEvent.VK_Q), label);
JButton myButton = new JButton(myAction);
}
}
Run Code Online (Sandbox Code Playgroud) 问题已解决!!!!!! 非常感谢trashgod和HoverCraftFullOfEels!我终于通过使用下面的例子并略微改变它来获得这个概念.更改允许缩放进度条(默认为100个单位).再次感谢您的耐心和愿意为此而努力.意味着很多人,~Kyte
ps - + 1全部'围绕:)
/** @see http://stackoverflow.com/questions/4637215 */
public class Threading_01 extends JFrame {
private static final String s = "0.00";
private JProgressBar progressBar = new JProgressBar(0, 100);
private JLabel label = new JLabel(s, JLabel.CENTER);
public Threading_01() {
this.setLayout(new GridLayout(0, 1));
this.setTitle("?2");
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
this.add(progressBar);
this.add(label);
this.setSize(161, 100);
this.setLocationRelativeTo(null);
this.setVisible(true);
}
public void runCalc() {
// progressBar.setIndeterminate(true);
TwoWorker task = new TwoWorker();
task.addPropertyChangeListener(new PropertyChangeListener() {
@Override
public void propertyChange(PropertyChangeEvent e) {
if ("progress".equals(e.getPropertyName())) {
progressBar.setIndeterminate(false);
progressBar.setValue((Integer) e.getNewValue());
System.out.println("**: " …Run Code Online (Sandbox Code Playgroud) 该程序大多数工作正常,但不打开任何窗口.它应该在桌面右下方显示一个小对话框.但是对于另一个人来说,编译相同的代码没有问题.我们有相同的Java运行时(1.8_u40).我怎样才能解决这个问题?
我把代码放在下面:
import java.awt.Dimension;
import java.awt.Font;
import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
import java.awt.Insets;
import java.awt.Toolkit;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.geom.RoundRectangle2D;
import javax.swing.JButton;
import javax.swing.JDialog;
import javax.swing.JLabel;
import javax.swing.JProgressBar;
import javax.swing.UIManager;
import javax.swing.UnsupportedLookAndFeelException;
public class ProgressDialog {
private JDialog dialogFrame;
private JProgressBar progressBar;
private JLabel headingLabel;
private Uploader callerUploader;
public ProgressDialog() {
dialogFrame = new JDialog();
try {
UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
} catch (ClassNotFoundException | InstantiationException | IllegalAccessException
| UnsupportedLookAndFeelException ex) {
System.err.println(ex.toString());
}
dialogFrame.setSize(200, 50);
dialogFrame.setLayout(new GridBagLayout());
GridBagConstraints constraints = new GridBagConstraints(); …Run Code Online (Sandbox Code Playgroud) 我正在尝试建立有关SwingPropertyChangeSupport的问题的答案
我试图在非常有用的Hovercraft Full Of Eels的答案中修改这里给出的代码: WindowListener不能按预期工作,以允许在通过输入对话框输入更改时更新显示的数组.
数组已更新,但未在GUI中刷新.我希望有人能告诉我哪里出错了.
这是代码:
import java.awt.BorderLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.FocusListener;
import java.beans.PropertyChangeEvent;
import java.beans.PropertyChangeListener;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JTextArea;
import javax.swing.event.SwingPropertyChangeSupport;
public class Main {
public static void main(String[] arg) {
GuiForUpdate display = new GuiForUpdate();
display.setVisible(true);
}
}
class GuiForUpdate extends JFrame implements ActionListener {
/**
*
*/
private static final long serialVersionUID = 1L;
private FocusListener focusListener;
private String mList;
private JButton changeArrayButton;
private JTextArea codeIn, …Run Code Online (Sandbox Code Playgroud) 我正在使用不同的按钮构建一个grpahic界面,当用户单击按钮时,我使用:
actionPerformed(ActionEvent e) {
Object source = e.getSource();
if
else if
else if
...
}
Run Code Online (Sandbox Code Playgroud)
问题是当用户点击一个按钮时,actionPerformed(ActionEvent e)被调用,并且它输入if对应的e.getSource();.并执行相应if中的所有指令.但我想让用户点击不同的按钮成为可能,这样就actionPerformed(ActionEvent e)可以调用{,即使前一个指令actionPerformed(ActionEvent e){尚未完成.
我不知道你是否理解,但如果你能帮助我,谢谢!
java ×7
swing ×6
awt ×2
jbutton ×2
action ×1
actionevent ×1
arrays ×1
java-8 ×1
jdialog ×1
jframe ×1
jprogressbar ×1
refresh ×1
resize ×1
swingworker ×1