【问题标题】:Java Swing JFrame Background is not showingJava Swing JFrame 背景未显示
【发布时间】:2012-11-08 01:18:55
【问题描述】:

我不知道为什么我的 Jframe 上没有显示背景颜色。下面是我尝试过的代码。

当我打电话时

AnimatedDialogBox animatedDialogBox = new AnimatedDialogBox("Saving TransSet form", dataSheetTable);

它没有显示我需要的确切颜色。它显示没有任何背景颜色。 AnimatedDialogBox 类如下:

import java.awt.Color;
import java.awt.Dimension;
import java.awt.Point;
import java.awt.Toolkit;
import java.beans.PropertyChangeEvent;
import java.beans.PropertyChangeListener;
import javax.swing.JComponent;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JProgressBar;
import javax.swing.SwingWorker;
import net.miginfocom.swing.MigLayout;


public class AnimatedDialogBox {

    private JFrame progressDialog ;
    private JProgressBar bar;
    private Task task;
    private ResourceManager resourceManager = new ResourceManager();

    public AnimatedDialogBox(String message, JComponent parentComponent) {
        progressDialog = new JFrame( message);
        progressDialog.setLayout(new MigLayout());
        progressDialog.setUndecorated(true);
          progressDialog.setBackground(resourceManager.getColor("error.Panel.background")); // RGB = 243, 255, 159
        progressDialog.setPreferredSize(new Dimension(300, 100));
        JLabel label = new JLabel(message);
        label.setBackground(resourceManager.getColor("error.Panel.background"));
        progressDialog.add(label, "gapbefore 80,gapbottom 30, wrap");
        bar = new JProgressBar(0, 100);
        bar.setIndeterminate(true);
        bar.setBackground(resourceManager.getColor("error.Panel.background"));
        progressDialog.add(bar, "gapbefore 80, gapbottom 30, wrap");
        progressDialog.setFocusableWindowState(false);
        Point point = progressDialog.getLocation();
        Dimension cDim = parentComponent.getSize();

        progressDialog.setLocation((int) (cDim.getWidth() / 2)-100,
                    (int) cDim.getHeight() + 350);

        progressDialog.pack();

        task = new Task();
        task.addPropertyChangeListener(new PropertyChangeListener() {
            @Override
            public void propertyChange(PropertyChangeEvent evt) {
                if (evt.getPropertyName().equalsIgnoreCase("progress")) {
                    int progress = task.getProgress();
                    if (progress == 0) {
                        bar.setIndeterminate(true);
                    } else {
                        bar.setIndeterminate(false);
                        bar.setValue(progress);
                        progressDialog.dispose();
                    }
                }
            }
        });
        task.execute();
        progressDialog.setVisible(true);
    }

    class Task extends SwingWorker<Void, Void> {
        private static final long SLEEP_TIME = 1000;

        public Task() {
        }

        @Override
        public Void doInBackground() {
            setProgress(0);
            try {
                Thread.sleep(SLEEP_TIME);// imitate a long-running task
            } catch (InterruptedException e) {
            }
            setProgress(100);
            return null;
        }

        @Override
        public void done() {
            Toolkit.getDefaultToolkit().beep();
        }
    }
}

【问题讨论】:

    标签: java swing background jframe


    【解决方案1】:

    JProgressBar 的背景颜色由其 UI 委托 ProgressBarUI 确定。例如,

    UIManager.put("ProgressBar.background", Color.red);
    

    并非所有实现都使用颜色;例如,com.apple.laf.AquaProgressBarUI 忽略设置以支持here 的外观。作为替代方案,您可能需要考虑有色背景或封闭面板上的Border,建议here

    另请注意,您可以通过process() 方法更新GUI,如here 所示。

    【讨论】:

      【解决方案2】:

      一些想法:

      1. 您不应该将组件直接添加到 JFrame。相反,您的内容应该放在“内容窗格”中。请参阅 JFrame.setContentPane()、JFrame.getContentPane()。您可能需要参考 JFrame 文档或教程。

      2. 如果组件不是不透明的,则不会呈现其背景。请参阅 JComponent.setOpaque()、Component.isOpaque()。

      【讨论】:

      • JFrame#add() 转发contentPane
      • +1 到与contentPane 相关的想法,虽然我猜唯一缺少的是JFrame 仅覆盖contentPane 的三个方法,即setLayout(), remove() and add()。所以我想为了改变颜色需要frame.getContentPane().setBackground(Color.RED);。这将改变上述事物的背景颜色。
      • @GagandeepBali:很好的洞察力;对于setBackground(),“尊重此属性取决于外观,有些人可能会选择忽略它。”
      猜你喜欢
      • 1970-01-01
      • 2023-03-14
      • 1970-01-01
      • 2011-08-15
      • 2021-05-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多