2

我用一个简单的渐变扩展 JComponent 并调整了 paintComponent() 方法制作了自己的 BottomBar。

然后我将它添加到使用 BorderLayout 的 JFrame 的 SOUTH 中。

一开始一切看起来都是正确的。当我调整框架的大小时,BottomBar 被重新绘制并正确设置到新位置。想法是,它会延迟几毫秒,因此人们可以看到 JFrame 的背景一秒钟。

有趣的是,当我将执行环境设置为 Java-SE 1.6 时,它可以工作......(而不是 1.7)另外,我在 mac 上运行它,如果这有什么不同的话。

调整大小和未调整大小时比较窗口的屏幕截图


代码 - JButton 示例

import java.awt.BorderLayout;
import java.awt.EventQueue;
import javax.swing.JButton;
import javax.swing.JFrame;


public class Main {

    public static void main(String args[]){
        EventQueue.invokeLater(new Runnable() {

            @Override
            public void run() {
                JFrame frame = new JFrame("Resize Example");
                frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                frame.add(new JButton(), BorderLayout.SOUTH);
                frame.pack();
                frame.setLocationByPlatform(true);
                frame.setVisible(true);
            }
        });
    }
}

代码 - BottomBar 示例

主要的:

public class Main {
    public static void main(String args[]){
        Frame window = new Frame();
        window.setSize(500, 400);
        window.setVisible(true);
    }
}

框架:

import java.awt.BorderLayout;

import javax.swing.JFrame;


public class Frame extends JFrame{
    private static final long serialVersionUID = 1L;

    public Frame() {
        setLayout( new BorderLayout() );
        getContentPane().add( BorderLayout.SOUTH, new BottomBar() );
    }
}

底栏

import java.awt.Color;
import java.awt.Dimension;
import java.awt.GradientPaint;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.RenderingHints;

import javax.swing.JComponent;

public class BottomBar extends JComponent {
    private static final long serialVersionUID = 1L;

    public BottomBar() {
        setSize(200, 30);
        setPreferredSize( new Dimension(200, 30) );
    }

    protected void paintComponent(Graphics g) {
        Graphics2D g2 = (Graphics2D)g;

        g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING,RenderingHints.VALUE_ANTIALIAS_ON);

        GradientPaint gradient = new GradientPaint(0, 0, new Color(185, 185, 185), 0, getHeight() , new Color(151, 151, 151) );
        g2.setPaint(gradient);
        g2.fillRect(0, 0, getWidth(), getHeight());

        g2.setColor( new Color(64, 64, 64) );
        g2.drawLine(0, 0, getWidth(), 0);
        g2.setColor( new Color(215, 215, 215) );
        g2.drawLine(0, 1, getWidth(), 1);
    }
}
4

1 回答 1

3

我无法重现您在 1.6 上描述的效果;您可以在 1.7 上尝试下面的sscce。请注意,您的示例有几个建议:

  • 避免,正如这里setXxxxSize()所讨论的。如果您只想要一个 30 像素高的条形图,请按如下所示进行覆盖。如果您稍后决定添加组件,则需要添加布局管理器。SOUTHgetPreferredSize()

    @Override
    public Dimension getPreferredSize() {
        return new Dimension(0, 30);
    }
    
  • 用于pack()Window采用封闭组件的首选尺寸。我在 ; 中添加了JPanel任意CENTER大小 调整框架的大小以查看条在SOUTH.

  • Swing GUI 对象应该事件分派线程上构建和操作。

底栏

import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.EventQueue;
import java.awt.GradientPaint;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.RenderingHints;
import javax.swing.JComponent;
import javax.swing.JFrame;
import javax.swing.JPanel;

/** @see https://stackoverflow.com/a/13610367/230513 */
public class Main {

    public static void main(String args[]) {
        EventQueue.invokeLater(new Runnable() {

            @Override
            public void run() {
                JFrame frame = new JFrame("BottomBar");
                frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                frame.add(new JPanel() {

                    @Override
                    public Dimension getPreferredSize() {
                        return new Dimension(320, 240);
                    }
                }, BorderLayout.CENTER);
                frame.add(new BottomBar(), BorderLayout.SOUTH);
                frame.pack();
                frame.setLocationByPlatform(true);
                frame.setVisible(true);
            }
        });
    }

    private static class BottomBar extends JComponent {

        @Override
        public Dimension getPreferredSize() {
            return new Dimension(0, 30);
        }

        @Override
        protected void paintComponent(Graphics g) {
            Graphics2D g2 = (Graphics2D) g;
            g2.setRenderingHint(
                RenderingHints.KEY_ANTIALIASING,
                RenderingHints.VALUE_ANTIALIAS_ON);
            GradientPaint gradient = new GradientPaint(
                0, 0, new Color(185, 185, 185),
                0, getHeight(), new Color(151, 151, 151));
            g2.setPaint(gradient);
            g2.fillRect(0, 0, getWidth(), getHeight());
            g2.setColor(new Color(64, 64, 64));
            g2.drawLine(0, 0, getWidth(), 0);
            g2.setColor(new Color(215, 215, 215));
            g2.drawLine(0, 1, getWidth(), 1);
        }
    }
}
于 2012-11-28T16:56:48.057 回答