我正在使用以下代码在我的swing应用程序中显示错误消息
try {
...
} catch (Exception exp) {
JOptionPane.showMessageDialog(this, exp.getMessage(), "Error", JOptionPane.ERROR_MESSAGE);
}
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) 我有一个使用表模型从数据结构加载的JTable.数据结构的格式是NavigableMap<Float,NavigableMap<Float,Boolean>>.示例数据是:
Table Format:
Range f1,v1 f2,v2 f3,v3 f4,v4
12.1-30.2 30,true 32,false 45,true 50,false
30.2-45.6 30,true 32.4,true 45,true 50.1,true
Run Code Online (Sandbox Code Playgroud)
以上数据格式在DS中表示为
DS Format:
Key Value
12.1 <<30,true>,<32,false>,<45,true>,<50,false>>
30.2 <<30,true>,<32.4,true>,<45,true>,<50.1,true>>
45.6 null
Run Code Online (Sandbox Code Playgroud)
我已经设法使用table-model在Jtable中表示上面给出的数据.一旦数据从DS加载到表我必须允许用户编辑.现在我有问题.我怀疑是否应该保留数据结构与表中的更改同步,或者我应该在用户完成编辑后从表中重新创建DS,然后将其替换为旧的DS.
更多我需要验证数据(例如从上面 - 假设用户想要编辑值30.1.他应该只允许输入12.1和45.6之间的值.因为数据表是字符串的(一旦加载)我是计划使用正则表达式和键监听器,并使用所有用户键按下与正则表达式不匹配的值和不在范围内的值.我不确定这是一个好主意还是含义.我会想得到一些建议.
我有一个秋千 JTable使用大量数据动态更新 - 不断添加新行,并在几分钟内添加1000-2000行.我已经注册了一个Listener来响应使用的单行选择事件来执行一些工作人员.我已经使用Observer模式进行Swing数据绑定,并且表的模型由WritableList实现支持.因此,新项目将从其自己的Realm添加到表中.并且从SWT UI线程添加了Listener.问题是,当新行添加到表时,它不会立即响应用户行选择事件.只有在停止更新表格模型时,表格才会响应用户选择 - 有时会延迟30-60秒.请帮助我解释为什么我的表模型在深度更新时不会立即响应用户选择,以及如何克服此限制.
请将RowFilter(它的ComparisonType)放在一起
和...一起
不知道怎么样
欢迎提供更长更详细的说明
在这个SSCCE中看到我的基本问题frame.add(new JButton(new AbstractAction("Toggle filter") {


import java.awt.BorderLayout;
import java.awt.event.ActionEvent;
import java.util.Calendar;
import java.util.Date;
import javax.swing.*;
import javax.swing.table.DefaultTableModel;
import javax.swing.table.TableModel;
import javax.swing.table.TableRowSorter;
public class JTableFilterDemo {
private static TableRowSorter<TableModel> sorter;
private Object[][] data = {{"A", 5, true, new Date()},
{"B", 2, false, new Date()}, {"C", 4, false, new Date()},
{"D", 8, true, new Date()}, {"E", 13, false, new Date()},
{"F", 7, true, new Date()}, {"G", …Run Code Online (Sandbox Code Playgroud) 我有一个SwingWorker类加载一个文本文件并将其切片到块进行进一步处理.
这是SwingWorker班级:
public class ConverterWorker extends SwingWorker<String, String>
{
private final File f;
private final JLabel label;
public ConverterWorker(File f, JLabel label)
{
this.f = f;
this.label = label;
}
@Override
protected String doInBackground() throws Exception
{
NMTMain.convertableData = getDataSets(f);
if(!NMTMain.convertableData.isEmpty())
{
return "Done";
}
else
{
publish("Failed to load the file!");
return "Failed";
}
}
@Override
public void done()
{
try
{
label.setText(get());
}
catch (Exception e)
{
e.printStackTrace(System.err);
System.out.println("error");
}
}
@Override
protected void …Run Code Online (Sandbox Code Playgroud) 在java swing tablemodel中,我们可以触发表更改,添加,删除等.我想知道如果组件不可见,这些方法调用是否很昂贵?
例如,另一个窗口覆盖它.或者它处于非活动选项卡中.
我正在GUI为数据库创建一个项目,有两个类用于GUI's.连接器类用于连接用户凭据.如果凭据正确,则获取from中的所有数据AbstractTableModel.当程序先运行时GUI有一个按钮,我们在其中单击它并获取底层的所有数据TableModel.但我面临两个问题.在GUI2课堂上,有时它会像这样打开.
有时它显示这样
http://imageshack.com/i/p3gBDt9Ej
我不知道为什么会这样.第二个问题是当我们从表中选择任何行并单击DeleteSelectedRow按钮时它会删除该行.此按钮有一个ActionListener中GUI2类.但我想要的是我删除行时自动更新表.我怎样才能做到这一点?
第一课 GUI
public class Gui extends JFrame {
private static Connector conni;
private Connection conn = null;
private JButton bt;
private JPanel panel;
public Gui() {
super("Frame");
panel = new JPanel();
bt = new JButton("Connect to Database 'World'");
panel.add(bt);
bt.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
conn = conni.Connector();
if (conn != null) {
dispose();
new …Run Code Online (Sandbox Code Playgroud) java ×8
swing ×8
jtable ×3
exception ×1
html ×1
jdbc ×1
joptionpane ×1
jpopupmenu ×1
jprogressbar ×1
rowfilter ×1
swingworker ×1
tablemodel ×1
thread-sleep ×1