在我的三键鼠标MouseEvent.BUTTON2=中键单击和MouseEvent.BUTTON3=右键单击.
这是两键鼠标的情况吗?
谢谢
如何获得JPanel所在的JFrame?
我目前的解决方案是询问面板的父级(依此类推),直到找到一个Window:
Container parent = this; // this is a JPanel
do {
parent = parent.getParent();
} while (!(parent instanceof Window) && parent != null);
if (parent != null) {
// found a parent Window
}
Run Code Online (Sandbox Code Playgroud)
是否有更优雅的方式,标准库中的方法可能是?
经过多年的Java编程,我总是习惯于创建main()这样的方法:
public static void main(String[] args)
{
runProgram();
}
Run Code Online (Sandbox Code Playgroud)
但是最近我从Web上学习了一些代码并且有时看到这个代码而不是main()上面的常规用法:
public static void main(String[] args)
{
SwingUtilities.invokeLater(new Runnable()
{
public void run()
{
runProgram();
}
});
}
Run Code Online (Sandbox Code Playgroud)
我只是想知道:
main()方式?当我试一试时,我看不出有任何区别.感谢您阅读我和您的答案.
可能重复:
SwingUtilities.invokeLater做什么?
SwingUtilities.invokeLater
我已经看过几百次这段代码了:
public static void main(String[] args) {
javax.swing.SwingUtilities.invokeLater(new Runnable() {
public void run() {
createAndShowGUI();
}
});
}
Run Code Online (Sandbox Code Playgroud)
现在我的问题是:做invokeLater()什么?如果我只是在主线程中创建并显示我的GUI,会发生什么样的坏事?
SwingWorker 用于以下目的:
done()方法在任务结束时使用长时间运行的任务生成的结果更新GUI .publish()和process()方法生成和发布的中间结果不时更新GUI .SwingUtilities.invokeLater() 可以执行以下任务:
SwingWorker.execute()我们可以执行,而不是从EDT 执行方法,ExecutorService.submit(new MyRunnable())因为它还将创建另一个可以执行长时间运行任务的线程.done()case1的方法编写)SwingUtilites.invokeLater(new RunnableToExecuteDoneMethodCode()).process()case1的方法编写)SwingUtilites.invokeLater(new RunnableToExecuteProcessMethodCode())放在我们publish()在case1中调用方法的地方.我问这个问题是因为Java-SwingWorker中指定的问题- 我们可以从其他SwingWorker调用一个SwingWorker而不是EDT可以通过SwingUtilities.invokeLater()但是无法解决SwingWorker
在尝试移植 Swing 代码以与 Java 模块系统兼容时,我在尝试替换SwingUtilities3.setDelegateRepaintManager.
我有一个组件,当它的任何子级请求重绘时,我需要转换该区域(特别是这试图为org.pbjar.jxlayer.plaf.ext.TransformUI知道这一点的任何人移植代码)。目前,这是通过设置组件的委托重绘管理器并拦截对 的调用来完成的addDirtyRegion。
现在使用 Java 9,这样做的方法不再作为公共 api 可用。原始代码提供了一种替代方法,该方法最初用于SwingUtilities3.setDelegateRepaintManager不可用的旧版 Java ,它只是用RepaintManager委托实现替换了全局。如果组件包含在需要转换的实际组件中,它会检查每个调用。然而,该解决方案丢弃了 的所有内部数据RepaintManager并导致在调整框架大小时严重闪烁。
这是当前使用的代码的删节版:
SwingUtilities3.setDelegateRepaintManager(component, new TransformRepaintManger());
...
class TransformRepaintManager extends RepaintManager {
@Override
public void addDirtyRegion(JComponent c, int x, int y, int w, int h) {
if (c.isShowing()) {
Point point = c.getLocationOnScreen();
SwingUtilities.convertPointFromScreen(point, c);
Rectangle transformPortRegion = transform(new Rectangle(x + point.x, y + point.y, w, h), c);
RepaintManager.currentManager(c)
.addDirtyRegion(c,
transformPortRegion.x, transformPortRegion.y,
transformPortRegion.width, transformPortRegion.height);
} …Run Code Online (Sandbox Code Playgroud) java swing java-platform-module-system swingutilities repaintmanager
我正在尝试用Java创建一个应用程序.为了使Swing正常工作,我这样做了:
public static void main(String[] array){
String outerInput;
SwingUtilities.invokeLater(new Runnable(){
@Override
public void run() {
// I want this string input.
String input = JOptionPane.showInputDialog(
null,"Stop ?", JOptionPane.QUESTION_MESSAGE);
});
// How can I get this input value in String outerInput?
}
Run Code Online (Sandbox Code Playgroud)
我如何在我的主体中获得此输入字符串?
请问有没有另一种方法如何在运行时更改Font作为整个AWT/Swing GUI使用FontUIResource,没有任何知识/兴趣,如果有局部变量和JComponents的类型


import java.awt.*;
import java.awt.event.*;
import java.util.Locale;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.swing.*;
import javax.swing.plaf.FontUIResource;
import javax.swing.plaf.basic.BasicComboBoxRenderer;
public class SystemFontDisplayer extends JFrame {
private static final long serialVersionUID = 1L;
private JFrame frame = new JFrame("Nimbus UIDeafaults and Font");
private JComboBox fontsBox;
private javax.swing.Timer timer = null;
private JButton testButton = new JButton("testButton");
private JTextField testTextField = new JTextField("testTextField");
private JLabel testLabel = new JLabel("testLabel");
public SystemFontDisplayer() {
GraphicsEnvironment ge = GraphicsEnvironment.getLocalGraphicsEnvironment();
String[] fontFamilyNames = ge.getAvailableFontFamilyNames(Locale.getDefault());
fontsBox = new …Run Code Online (Sandbox Code Playgroud) 有人可以突出显示这两者之间的差异吗?两者都是必需的?!
我有一个应用程序,它同时使用,但想知道一个是否优于另一个.显然他们都接受了Runnable object,所以对我来说 - 我想我可以使用我喜欢的那个.
为什么这两个类似的功能在不同的类中?我知道有一个在awt和另一个Swing,但他们不是做同样的事情吗?
我正在编写一个 javafx 程序,我需要面板以恒定的速度更新。现在它设置为每秒更新一次。但我得到了这个错误,通常(但并非总是)当整个场景变得扭曲时,面板中会出现故障(它就像镜子本身以奇怪的断断续续的 x 模式一样。很难解释)。
完整错误:(java:22494): Gdk-WARNING **: 18:38:59.118: 调用 XSetErrorHandler() 并推送 GDK 错误陷阱。不要那样做。
这是我的计时器代码:
Timer timer = new Timer();
timer.scheduleAtFixedRate(new TimerTask() {
@Override
public void run() {
SwingUtilities.invokeLater(new Runnable() {
@Override
public void run() {
try {
String x = txtDisplay.getText();
txtDisplay.setText(x.substring(1, x.length()) + x.substring(0, 1));
} catch (NullPointerException e) {
System.out.println("Error.");
}
}
});
}
}, 0, 500);
Run Code Online (Sandbox Code Playgroud)
我认为问题出在上面的块上,就像我可能违反了一些基本的挥杆规则一样。我的另一个想法是,它有两种方法同时编辑同一文本区域,因为我有其他方法设置文本区域的文本。
我很高兴能找到错误的解决方案或执行上述方法的更好方法。只需要每秒运行一次而不会崩溃。
谢谢。
编辑:一个新的开发,我现在不断收到“线程“AWT-EventQueue-0”java.lang.NullPointerException 中的异常”,但堆栈跟踪没有引用我的代码中的任何位置。
swingutilities ×10
java ×9
swing ×9
invokelater ×2
awt ×1
eventqueue ×1
fonts ×1
input ×1
java-platform-module-system ×1
javafx ×1
jcomponent ×1
jframe ×1
mouse ×1
right-click ×1
swingworker ×1