2

JComponentを拡張し、paintComponent()メソッドを調整する単純なグラデーションを使用して、独自のBottomBarを作成しました。

次に、BorderLayoutを使用するJFrameのSOUTHに追加します。

最初はすべてが正しいように見えます。フレームのサイズを変更すると、BottomBarが再描画され、新しい位置に正しく設定されます。考えてみれば、それは数ミリ秒から遅れて発生するため、JFrameの背景を1秒間見ることができます。

面白いことに、実行環境を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() );
    }
}

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 に答える