- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我在运行 OSX 10.7.5 的 Mac 上使用 Eclipse IDE 进行开发。该程序构造了一个 JPanel 数组,当用户单击一个面板时,同一行或同一列上的所有其他面板都会改变颜色,鼠标左键为蓝色,右键为红色。当我从 IDE 运行时,一切正常,至少我从未见过它失败。但是,当我创建一个 .jar 文件并通过双击该文件运行时,大多数时候它工作正常,但偶尔它不会改变其他一些面板的颜色。
为了测试,我选择一个方 block ,然后右键单击和左键单击它。正如我所说,大多数时候它都能工作,同一行或同一列中的所有其他面板都会改变颜色。但是,如果我右键单击一个正方形并且某些面板保持蓝色,那就是失败。如果我再次右键单击同一个方 block ,它不会改变显示;失败的面板保持蓝色。就好像经理认为一切都是正确的颜色并且懒得更新显示。
如果我调整面板大小或使用任一按钮单击任何其他方 block ,所有面板都会翻转为正确的颜色。这段代码没有显式调用 repaint() 但我已经尝试过,但它没有解决问题。我尝试阅读有关重绘管理器的内容,但尚未找到使显示可靠更新的方法。正如我所说,在运行 IDE 时我从未见过这种情况发生,而且大多数时候它也作为应用程序运行。刚才大概点击了50次就失败了。
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
public class GUITest extends JPanel {
final static int NROWS = 81;
final static int TOTAL_SQ = NROWS * NROWS;
Square[] square = new Square[TOTAL_SQ];
public GUITest() {
setLayout(new GridLayout(NROWS, NROWS));
for (int i = 0; i < TOTAL_SQ; i++) {
square[i] = new Square(i);
add(square[i]);
}
}
public void squareClicked(int id, int button) {
// determine which row and column
int row = id / NROWS;
int col = id % NROWS;
// change background color of all squares on same row or column
for (int i = 0; i < TOTAL_SQ; i++) {
if ((row == i / NROWS) || (col == i % NROWS))
if (button == MouseEvent.BUTTON3)
square[i].setBackground(Color.RED);
else
square[i].setBackground(Color.BLUE);
}
} // squareClicked
class Square extends JPanel implements MouseListener {
int id = 0; // which square this is
public Square(int id) {
this.id = id;
setBorder(BorderFactory.createLineBorder(Color.black));
addMouseListener(this);
} // Square constructor
public void mouseClicked(MouseEvent e) {
}
public void mouseEntered(MouseEvent e) {
}
public void mouseExited(MouseEvent e) {
}
public void mousePressed(MouseEvent e) {
}
public void mouseReleased(MouseEvent e) {
squareClicked(id, e.getButton());
}
} // Square
public static void main(String[] args) {
JFrame frame = new JFrame("GUI Test");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
GUITest app = new GUITest();
frame.setSize(800, 600);
frame.setLocationRelativeTo(null);
frame.getContentPane().add(app, BorderLayout.CENTER);
frame.setVisible(true);
}
}
我有第二个问题可能相关。 IDE 显示速度比应用程序快得多。 IDE 更新很快。该应用程序单独更新每个面板,速度明显较慢。我猜想 IDE 使用的是双缓冲显示。我也读到了这一点,但不知道如何让它推迟更新,直到整个显示器准备好。
提前致谢。
最佳答案
我没有发现您的逻辑有任何问题,并且当我在 Windows 7 上使用 JDK7 从命令行运行代码时,我无法重复您的问题。
但是,当我运行代码时,框架加载时确实出现异常:
C:\Java>java GUITest
Exception in thread "AWT-EventQueue-0" java.lang.IllegalArgumentException: Comparison method violates its general contract!
at java.util.TimSort.mergeLo(Unknown Source)
at java.util.TimSort.mergeAt(Unknown Source)
at java.util.TimSort.mergeCollapse(Unknown Source)
at java.util.TimSort.sort(Unknown Source)
at java.util.TimSort.sort(Unknown Source)
at java.util.Arrays.sort(Unknown Source)
at java.util.Collections.sort(Unknown Source)
at javax.swing.SortingFocusTraversalPolicy.enumerateAndSortCycle(Unknown Source)
at javax.swing.SortingFocusTraversalPolicy.getFocusTraversalCycle(Unknown Source)
at javax.swing.SortingFocusTraversalPolicy.getFirstComponent(Unknown Source)
at javax.swing.LayoutFocusTraversalPolicy.getFirstComponent(Unknown Source)
at javax.swing.SortingFocusTraversalPolicy.getDefaultComponent(Unknown Source)
我尝试的第一件事是确保所有代码都在 EDT 上执行:
EventQueue.invokeLater(new Runnable()
{
public void run()
{
JFrame frame = new JFrame("GUI Test");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
GUITest app = new GUITest();
frame.getContentPane().add(app, BorderLayout.CENTER);
frame.setSize(800,600);
frame.setLocationRelativeTo(null);
frame.setVisible(true);
}
});
我仍然遇到异常。因此,我尝试更改代码以减少单个面板上显示的组件数量:
setLayout( new GridLayout(NROWS,1) );
int squares = 0;
for (int i = 0; i < NROWS; i++)
{
JPanel panel = new JPanel( new GridLayout(1, NROWS) );
for (int j = 0; j < NROWS; j++)
{
square[squares] = new Square(squares);
panel.add( square[squares] );
squares++;
}
add( panel );
}
我不再遇到异常。不知道这是否有帮助。
此外,Swing 默认情况下是双缓冲的,因此我不确定为什么每个组件都要单独更新。 Swing 应该合并各个组件的重绘请求,以便一次性完成这些请求,但可能只重绘一组组件。
解决这个问题的唯一方法是不使用组件,而是创建自己的组件来对每个矩形进行自定义绘制。当然,这会更加复杂,因为您还需要进行自己的“点击检测”来确定单击了哪个矩形。
关于java - GUI 更新可以在 IDE 中工作,但并不总是从 jar 文件中进行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20277930/
我不明白 int 63823 为何比 double 1.0 占用更少的空间。在这个特定实例中,int 中是否没有存储更多信息? 最佳答案 I don't understand how an int 6
这可能不是一个直接的代码问题,但它是一个经常出现在 SO 上的问题,我发现阅读它非常有用。 App Store - Help answering “Missing Compliance” (using
我在我们的应用程序中使用 syncfusion 寻呼机和下拉列表请打开以下链接。 https://stackblitz.com/edit/angular-nv6myv?file=src%2Fapp%2
以便解释指针和引用in this question我写了这段代码。 MyClass& MyClass::MyInstance() { static MyClass & myLoca
在 C 和 C++ 中,assert 是一个非常 重量级例程,将错误写入 stdout 并终止程序。在我们的应用程序中,我们实现了一个更强大的 assert 替代品,并为其提供了自己的宏。已尽一切努力
我已经创建了一个 MVC webApi 项目,现在我想使用身份验证和授权。我想我已经实现了这种安全措施,但由于某种原因,有些事情变糟了,当我编写我的凭据并尝试调用一些 webApi 方法时,显示消息“
我发现自己使用一种奇怪的方式向我的函数添加回调函数,我想知道是否有更通用的方式向函数添加回调函数,最好的情况是我的所有函数都检查最后给定的作为函数的参数,如果是,则将其用作回调。 我以前是这样的: v
几乎从来没有我只想获取某个 Remote 的情况;我总是想要所有的 Remote 。我认为这将是一个足够常见的用例,git 会考虑它(与他们有 pull.rebase true 的方式相同)。 那么,
我正在尝试使用 inarray 但它总是返回 true?有任何想法吗? (所有 li 均已显示) $("#select-by-color-list li").hide(); // get the se
我正在尝试为我公司的开发环境设置过期网址。我们使用 lighttpd在此环境中提供上传的文件,我发现 these docs这似乎相当有希望。 问题是我似乎根本无法让它工作,而且我有点不知所措,试图找出
我无法让“文件夹”外部变量工作。我总是得到[:]。 我正在 Windows 下的 Grails 上进行开发(这就是为什么外部配置文件看起来像 file:C:\path\to/file)。 我在另一个项
这个问题是出于对 PL 如何工作的好奇,而不是其他任何事情。 (它实际上是在查看与 Haskell 不同的 SML 时想到的,因为前者使用按值调用 - 但我的问题是关于 Haskell。) Haske
我有一个高速缓存内存模块,我希望它是可字寻址的,但有字节的写使能信号。 always @ (posedge clk) begin //stuff... if(write) begin
我正在处理一些代码,其中一个对象“foo”正在创建另一个对象对象“bar”,并向其传递一个Callable。之后 foo 将返回bar,然后我希望 foo 变得无法访问(即:可用于垃圾收集)。 我最初
我已将我的程序与此方法相关联: public static void CreateFileAssociation(string extension, string key, string descri
所以我正在进行目录遍历,但我无法让 opendir 按照我想要的方式工作。它总是无法打开我发送的目录,它给出了一些未知的错误。我通常传入 argv[1],但我放弃了,只是开始硬编码路径。 char *
这个问题在这里已经有了答案: How do I compare strings in Java? (23 个回答) 关闭 9 年前。 出于某种原因,我的(基本)程序总是打印我为 else 语句保留的
我不想冒为此提出破解的风险,因为它涉及 datetime 对象。基本上,我想按如下方式进行转换: 2010-04-21 06:37:53 -> 2010-04-21 06:40:00 2010-08-
我正在用 C 语言玩文件 I/O。我正在尝试使用 fgets 从一个文件中读取数据并将其输出到另一个文件。问题是它总是返回 NULL,因此没有任何内容被复制到输出文件中。这是我的代码: #includ
class MyClass { // empty class with no base class }; int main() { MyClass* myClass = new MyC
我是一名优秀的程序员,十分优秀!