我有一个进度对话框窗口,其中包含3个JComponents:JLabel,JProgressBar,JButton,它在不同线程的应用程序的不同部分用作默认对话框窗口。因此,当我尝试更改标签的值时,它不会清除其下的背景,它只是在旧文本上绘制新文本。包装类不会覆盖它只是将方法调用委托给它包含的组件的任何方法。
这是代码:
public void setNote(String note) {
this.note = note;
SwingUtilities.invokeLater(new Runnable() {
public void run() {
label.setText(ProgressDialog.this.note);
}
});
}
实际结果类似于http://www.daniweb.com/forums/post1073367.html#post1073367 但那个解决方案并不适合我。
有没有人遇到这样的问题?
感谢。
这是该类的cuted版本。但正如我所说,我不能让它错误地工作。希望这会有所帮助。
public class Tesssst {
public static void main(String [] args) {
JFrame frame = new JFrame();
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
ProgressDialog dialog = new ProgressDialog(frame, "Title", "Message");
dialog.showDialog(true);
}
}
class ProgressDialog extends JComponent {
/**
*
*/
private JProgressBar progressBar;
private JLabel label;
private JFrame parentComponent;
private String title;
private String note;
private boolean canceled;
private boolean cancelEnabled;
private JButton btnCancel;
private JPanel contentPanel;
public ProgressDialog(JFrame parentComponent, String title, String message) {
this.parentComponent = parentComponent;
this.title = title;
progressBar = new JProgressBar();
label = new JLabel();
contentPanel =new JPanel();
canceled = false;
cancelEnabled = true;
setNote(message);
setOpaque(true);
}
public void setNote(String note) {
this.note = note;
SwingUtilities.invokeLater(new Runnable() {
public void run() {
label.setText(ProgressDialog.this.note);
}
});
}
public String getNote() {
return note;
}
protected void initDialog() {
setBorder(new EmptyBorder(6, 6, 6, 6));
contentPanel = new JPanel();
contentPanel.setOpaque(true);
setLayout(new BorderLayout());
add(contentPanel);
btnCancel = new JButton("Cancel");
btnCancel.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
label.setText("ololo");
}
});
contentPanel.setLayout(new GridBagLayout());
{
GridBagConstraints gbc = new GridBagConstraints();
gbc.gridx = 0;
gbc.gridy = 0;
gbc.fill = GridBagConstraints.NONE;
gbc.anchor = GridBagConstraints.NORTHWEST;
gbc.insets = new Insets(2, 0, 0, 0);
label.setOpaque(true);
contentPanel.add(label, gbc);
} // label
{
GridBagConstraints gbc = new GridBagConstraints();
gbc.gridx = 0;
gbc.gridy = 1;
gbc.anchor = GridBagConstraints.NORTH;
gbc.weightx = 1;
gbc.fill = GridBagConstraints.HORIZONTAL;
gbc.insets = new Insets(4, 0, 4, 0);
contentPanel.add(progressBar, gbc);
} // progressBar
{
GridBagConstraints gbc = new GridBagConstraints();
gbc.gridx = 0;
gbc.gridy = 2;
gbc.anchor = GridBagConstraints.NORTH;
gbc.fill = GridBagConstraints.NONE;
gbc.insets = new Insets(4, 0, 4, 0);
contentPanel.add(btnCancel, gbc);
btnCancel.setEnabled(cancelEnabled);
} // cancel*/
} // funciton
public boolean isCanceled() {
return canceled;
}
public void showDialog() {
showDialog(false);
}
public void showDialog(boolean modal) {
JDialog dialog = new JDialog(parentComponent, true);
initDialog();
dialog.getContentPane().add(contentPanel);
dialog.setSize(400,400);
dialog.setDefaultCloseOperation(JDialog.DISPOSE_ON_CLOSE);
if (modal) {
dialog.setAlwaysOnTop(true);
}
dialog.setVisible(true);
dialog.toFront();
}
public void cancel() {
canceled = true;
}
}
答案 0 :(得分:4)
在标签上尝试setOpaque(true)
,这会导致它清除其背景。
答案 1 :(得分:2)
在适当的组件上尝试repaint()
。
答案 2 :(得分:2)
尝试扩展JPanel而不是JComponent。
JComponent没有任何代码来绘制其背景。因此,使组件不透明不会消除旧文本。保持标签不透明,并使用不透明的JPanel作为组件的容器。
也许你正在某处使用带有alpha值的背景。如果是这样,您可以查看Background With Transparency您可能遇到的一些问题。
否则,只有您可以将您的工作代码与非工作代码进行比较,以查看不同的内容。
答案 3 :(得分:2)
问题在于不透明度。在我们的默认外观中,“Panel.background”属性设置为new Color(135, 15, 19, 0)
。所以所有面板默认都是非透明的。名为repaint()
方法的标签和所有父面板都是非透明的,未执行后台刷新。
谢谢大家的回复。
答案 4 :(得分:1)
camickr的回答是正确的方法;但是你的测试显然有一个问题就是你的摇摆线程用法。
我怀疑它可能与它是一个对话有关。对话通常在调用showDialog()时阻止SWMET;因此,通常在showDialog()中创建第二个事件线程。在这里,你不是从你从主要调用它的SWMET调用showDialog() - 也许你看到了一些奇怪的效果。
public static void main(String args[]) throws Exception {
SwingUtils.invokeLater(new Runnable() {
public void run() {
ProgressDialog dialog = new ProgressDialog(frame, "Title", "Message");
dialog.showDialog(true);
}
});
}
答案 5 :(得分:-2)
您需要放置super.paintComponent(g);