在滚动时,有一些关于JScrollPane中类似故障的主题:
但他们缺乏SSCCE和案件的一些解释,所以我将添加缺少的东西.
首先,这是一个在纯Swing上编写的小例子,没有使用第三方代码:
public class ScrollGlitchExample extends JFrame
{
public ScrollGlitchExample () throws HeadlessException
{
super ();
final JPanel top = new JPanel ();
top.setPreferredSize ( new Dimension ( 300, 50 ) );
top.setBorder ( BorderFactory.createLineBorder ( Color.BLACK ) );
add ( top, BorderLayout.NORTH );
final JPanel panel = new JPanel ( new GridLayout ( 500, 1 ) );
for ( int i = 0; i < 500; i++ )
{
panel.add ( new JButton ( …Run Code Online (Sandbox Code Playgroud) 我制作了很多不同的 Swing 应用程序,它们的加载时间通常在几秒到几分钟之间变化,具体取决于应用程序 UI/数据大小。此外,在某些情况下,应用程序数据加载与 UI 加载混合。
几秒钟的加载时间不是问题,但是当它超过 10 秒时 - 很明显应该显示某种加载屏幕,直到 UI/数据完全初始化。
您通常会做什么 - 首先创建某种加载屏幕(例如,带有徽标的窗口和一些在应用程序加载时正在更新的标签),然后从应用程序中的各种加载“点”更新它。
问题是 - 应用程序通常在排队进入 EDT 的单个调用中加载,并且很难将其分成对 EDT 的多次调用而不会使应用程序的代码复杂化。因此,由于应用程序加载是在排队到 EDT 的单个调用中执行的,因此您根本无法正确更新加载屏幕 - 由于 EDT 忙于加载应用程序,因此在应用程序初始化之前不会显示更新。
因此,为了在某些情况下实现加载屏幕,我已将应用程序 UI 初始化移到 EDT 之外,并将它们设计为在执行加载时不会执行任何 UI 更新内容。应用程序的框架显示和所有应用程序 UI 操作仍将在 EDT 中执行。这通常不太好,但经过大量测试和查看 Swing 代码后,我确信即使在大型应用程序中它也不会导致任何问题。尽管如此,即使它不会引起任何问题,这通常也不是一件好事。
所以问题是:在 EDT 中保持应用程序初始化的同时,可以使用哪些方法来正确显示和更新应用程序加载屏幕?
希望它不是太宽泛。
这是一个展示“坏”方法的“虚拟”应用程序:
import javax.swing.*;
import java.awt.*;
public class DummyApplication extends JFrame
{
private static JDialog loadingDialog;
private static JLabel loadingProgress;
public DummyApplication ()
{
super ( "Dummy application" );
dummyProgressUpdate ( "Loading content...", 3000 ); …Run Code Online (Sandbox Code Playgroud) 在Java中是否有一种快速的方法来替换某些颜色的位图中的所有实例与其他颜色?
我正在使用的图像是一个非常大的5616 x 2160 24位非透明无索引位图,尽管此位图的像素值会有所不同.
这是我目前正在使用的代码,但它太慢了:http: //pastebin.com/UjgwgB0V
public class DisplayImage extends JFrame {
public DisplayImage(boolean resize, boolean mapCountries) throws IOException {
super("Province Map");
File mapProvinceFile = new File("map\\provinces.bmp");
BufferedImage mapProvinceImage = ImageIO.read(mapProvinceFile);
byte[] pixels = (byte[])mapProvinceImage.getRaster().getDataElements(0, 0, mapProvinceImage.getWidth(), mapProvinceImage.getHeight(), null);
if (mapCountries) {
for (int i = 0; i < Victoria2Stats.provinceDefinitionArray.size(); i++) {
for (int p = 0; p < pixels.length-3; p = p + 3) {
if ((byte)Victoria2Stats.provinceDefinitionArray.get(i).rgb[0] == pixels[p]) {
if ((byte)Victoria2Stats.provinceDefinitionArray.get(i).rgb[1] == pixels[p+1]) {
if …Run Code Online (Sandbox Code Playgroud) 如何将文件加载到主内存?
我用的是我读的文件
BufferReader buf = new BufferedReader(FileReader());
Run Code Online (Sandbox Code Playgroud)
我认为这是从磁盘逐行读取文件.这有什么好处?
将文件直接加载到内存中有什么好处?我们如何用Java做到这一点?
我找到了一些例子Scanner或RandomAccessFile方法.他们将文件加载到内存中吗?我应该使用它们吗?我应该使用哪两个?
提前致谢!!!
我有一个秋千 JTable使用大量数据动态更新 - 不断添加新行,并在几分钟内添加1000-2000行.我已经注册了一个Listener来响应使用的单行选择事件来执行一些工作人员.我已经使用Observer模式进行Swing数据绑定,并且表的模型由WritableList实现支持.因此,新项目将从其自己的Realm添加到表中.并且从SWT UI线程添加了Listener.问题是,当新行添加到表时,它不会立即响应用户行选择事件.只有在停止更新表格模型时,表格才会响应用户选择 - 有时会延迟30-60秒.请帮助我解释为什么我的表模型在深度更新时不会立即响应用户选择,以及如何克服此限制.
在(嵌入式)Ubuntu 12.04系统上,我们有一个简单的Java程序,它在窗口上显示一些图形模式,每秒钟更新一次.我们用它来监控系统上运行的一些进程.问题在于,虽然它是活动的而不是最小化的,但只要窗口更新,它就会窃取焦点.这使得无法使用开放式终端窗口.
运行应用程序表单命令行或从Eclipse IDE时,行为是相同的.
在NetBeans IDE下运行时,Windows 7上不会出现同样的问题.
我们如何防止Java应用程序将重点放在Ubuntu机器上?
更新1:发现这个问题似乎很难解决同样的问题: 如何停止/解决Java应用程序窃取Linux窗口管理器的焦点.阅读它,我了解到问题是使用JFrame作为容器,这是我们使用的.他们的解决方案是使用JWindow容器而不是JFrame容器.然而,寻找差异,JWindow是"赤裸裸",并没有表现得像一个"真正的"窗口,因为没有装饰.有没有办法在 JFrame中使用JWindow ,从而消除焦点窃取?
更新2:尝试在PC上的Ubuntu虚拟机上运行此程序会产生同样的错误行为.这表明Windows 7和Linux的Java运行时存在差异,并且该问题并非特定于嵌入式Linux.
更新3:这是一个SSCCE:
//package SSCCE;
import java.awt.*;
import java.awt.geom.*;
import javax.swing.*;
public class MonitorSSCCE extends JFrame{
public static void main(String[] args)
{
// Set the frame
JFrame ecoreFrame = new JFrame("SSCCE");
ecoreFrame.setSize(120, 120);
ecoreFrame.setVisible(true);
// Refresh frame every 200 msec
while (true) {
GRFX grfx = new GRFX();
ecoreFrame.add(grfx);
ecoreFrame.setVisible(true);
grfx = null;
try {
Thread.sleep(200);
} catch (InterruptedException e) {
}
} …Run Code Online (Sandbox Code Playgroud) 我在 HTML5 演示中使用 Javafx 实现相同的效果,但使用 Javafx 的帧速率非常低
我如何优化它,我是否写错了或者是否有其他更好的方法来实现它。
这是原始的 html5 演示项目:
<!doctype html>
<html>
<head>
<meta charset="utf-8">
<title>snows</title>
<script type="text/javascript" src="js/jquery.min.js"></script>
<style>
html,
body {
width: 100%;
height: 100%;
margin: 0;
padding: 0;
overflow: hidden;
}
.container {
width: 100%;
height: 100%;
margin: 0;
padding: 0;
}
</style>
</head>
<body>
<div id="jsi-snow-container" class="container"></div>
<script>
var RENDERER = {
SNOW_COUNT: { INIT: 100, DELTA: 1 },
BACKGROUND_COLOR: 'hsl(%h, 50%, %l%)',
INIT_HUE: 180,
DELTA_HUE: 0.1,
init: function () {
this.setParameters();
this.reconstructMethod();
this.createSnow(this.SNOW_COUNT.INIT …Run Code Online (Sandbox Code Playgroud) 我有一个Gui应用程序,可以在串行热敏打印机上打印票据.当我点击启动此操作的按钮时,我的GUI被冻结.我认为那是因为代码是在EDT上执行的.我使用jstack确定但我不理解下面的结果:
Full thread dump Java HotSpot(TM) Client VM (23.3-b01 mixed mode, sharing):
"Thread-12" prio=6 tid=0x03012000 nid=0xd04 runnable [0x038ef000]
java.lang.Thread.State: RUNNABLE
at gnu.io.RXTXPort.eventLoop(Native Method)
at gnu.io.RXTXPort$MonitorThread.run(RXTXPort.java:1575)
"Thread-6" prio=6 tid=0x0302c400 nid=0x1b0 waiting on condition [0x039ef000]
java.lang.Thread.State: TIMED_WAITING (sleeping)
at java.lang.Thread.sleep(Native Method)
at posO2.Threads.ThreadHorloge.run(ThreadHorloge.java:46)
"Thread-5" prio=6 tid=0x03511c00 nid=0x9e4 waiting on condition [0x0399f000]
java.lang.Thread.State: TIMED_WAITING (sleeping)
at java.lang.Thread.sleep(Native Method)
at posO2.Threads.ThreadIgor.run(ThreadIgor.java:29)
"Thread-7" prio=6 tid=0x034b9800 nid=0xb40 waiting on condition [0x0394f000]
java.lang.Thread.State: TIMED_WAITING (sleeping)
at java.lang.Thread.sleep(Native Method)
at posO2.Threads.ThreadHorloge.run(ThreadHorloge.java:46)
at java.lang.Thread.run(Unknown Source)
"Thread-4" prio=6 tid=0x0318ec00 nid=0xa08 …Run Code Online (Sandbox Code Playgroud) 我一直在浏览SO和谷歌一段时间来回答这个问题,但我似乎无法找到一个真正有用的.我将从头开始:
我创建了一个Java类,其中包含一个在后台运行批处理文件的方法(命令窗口不会出现).该程序运行良好,但对最终用户来说会有点混乱,因为批处理文件需要一段时间才能完成 - 用户不知道程序是否仍在运行.批处理脚本完成执行后,会出现一个消息对话框,说明它已完成,但是在运行方法和对话框出现之间的一段时间内,看起来好像程序什么也没做.
所以这是我的问题:我非常希望显示一个带有文本区域的新框架,该文本区域显示批处理文件的输出.但是,据我所知,如果不创建临时文件,写入文件,从中读取文件等,这很难做到.如果可能的话,我宁愿避免这样做.因此,我已经决定在进程运行时显示不确定的JProgressBar可能会更好,并在进程完成时关闭它.不幸的是,我不认为Swing可以处理这个问题,因为它需要同时运行多个进程.我听说过SwingWorker,但我不确定在这种情况下如何使用它.我有以下SSCCE,它可以工作,但没有实现进度条.
public myClass(){
public static void main(String[] args){
String[] commands = {"cmd.exe", "/C", "C:\\users\\....\\myBat.bat"};
Process p = Runtime.getRuntime().exec(commands);
p.waitFor()
JOptionPane.showMessageDialog(null, "Process finished!");
}
}
Run Code Online (Sandbox Code Playgroud)
当p.waitFor()等待进程时,屏幕上没有任何内容.我只是希望向用户显示进程仍在运行的内容.思考?谢谢!
我有3045的表格!组件(1015个标签,1015个文本字段,1015个组合框).所有这些都在JPanel和JScrollPane中的JPanel中.问题是滚动是"滞后".我的PC上有4GB RAM,所以我不认为这是问题所在.怎么了?在我的任务管理器中,应用程序使用~100mb.
我的代码:
final JScrollPane scrollPane_1 = new JScrollPane();
final JPanel panel = new JPanel();
panel.setLayout(null);
scrollPane_1.setViewportView(panel);
int y =0;
for(int i=0; i<1015;i++)
{
JLabel length = new JLabel();
length.setBounds(10, y, 350, 20);
length.setFont(new Font("Tahoma", Font.BOLD, 11));
length.setEnabled(false);
panel.add(length);
panel.revalidate();
JComboBox combo = new JComboBox();
combo.setModel(new DefaultComboBoxModel(new String[] {"=", "!="}));
combo.setBounds(10, y + 20, 70, 20);
panel.add(combo);
panel.revalidate();
JTextField text = new JTextField();
text.setBounds(10 + 80, y + 20, 200, 20);
panel.add(text);
panel.revalidate();
}
Run Code Online (Sandbox Code Playgroud)
编辑:我做了很多测试,我意识到只有当我使用组合框时才存在延迟,如果我使用例如文本字段而不是组合框,滚动是正常的...
java ×9
swing ×8
jscrollpane ×2
performance ×2
canvas ×1
colors ×1
draw ×1
file ×1
focus ×1
graphics ×1
javafx ×1
joptionpane ×1
jprogressbar ×1
jstack ×1
progress-bar ×1
ubuntu-12.04 ×1