Swing и JPanels, менеджеры по расположению - PullRequest
2 голосов
/ 11 июня 2011

Я пытался работать со свингом (впервые) несколько недель назад и немного рискнул сам, чтобы лучше почувствовать его. Кажется, у меня проблема с вертикальным выравниванием.

Вот ситуация: у меня есть JPanel boxlayout (Y_AXiS) в западной части границы. Внутри JPanel w / boxlayout у меня есть два других JPanel, которые я хочу выровнять по вертикали (подталкивать к верхней части экрана независимо от размеров рамки). Тем не менее, менеджер по расположению, кажется, помещает большое вертикальное пространство между двумя JPanels. Я думал, что, возможно, сетка лучше подойдет для этого, но я не уверен. Я много раз пытался найти ответ в Google и исправить проблему, но безуспешно. Помогите пожалуйста!

package com.granet;

import javax.swing.*;
import javax.swing.border.*;
import java.awt.*;


public class CustomerOrganizer  extends JFrame
{
    public CustomerOrganizer()
    {
        JPanel topPanel = new JPanel();
        topPanel.setBackground(Color.darkGray);

        JLabel customerSlogan = new JLabel("Customer Organizer");

        topPanel.add(customerSlogan);



        JPanel leftPanel = new JPanel();
        leftPanel.setBackground(Color.darkGray);
        leftPanel.setBorder(new EmptyBorder(10,100,00,0));


        leftPanel.setLayout(new BoxLayout(leftPanel, BoxLayout.Y_AXIS));

        DrawPanel firstTab = new DrawPanel(Color.white, 350, 50);
        DrawPanel secondTab = new DrawPanel(Color.white, 350, 50);

        JLabel firstTabText = new JLabel("First Tab");
        JLabel secondTabText = new JLabel("Second Tab");

        firstTab.setBorder(new EmptyBorder(0,60,60,0));
        secondTab.setBorder(new EmptyBorder(0,60,60,0));

        firstTab.add(firstTabText);
        secondTab.add(secondTabText);


        leftPanel.add(firstTab);
        leftPanel.add(secondTab);

        firstTab.setAlignmentX(Component.LEFT_ALIGNMENT);
        secondTab.setAlignmentX(Component.LEFT_ALIGNMENT);

/*      DOESN'T WORK, I'm pretty sure this changes the point on the jpanel which used for alignment (top, bottom, left or right) 
        firstTab.setAlignmentY(Component.TOP_ALIGNMENT);
        secondTab.setAlignmentY(Component.TOP_ALIGNMENT);
*/      


        add(topPanel, BorderLayout.NORTH);
        add(leftPanel, BorderLayout.WEST);

        pack();

    }

    public static void main(String[] args)
    {
        CustomerOrganizer frame = new CustomerOrganizer();
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setSize(700,400);
        frame.setVisible(true);

    }
}

DrawPanel.java

package com.granet;

import javax.swing.*;
import java.awt.*;

public class DrawPanel extends JPanel
{
    Color color;
    int width;
    int height;

    public DrawPanel(Color color, int width, int height)
    {
        this.color=color;
        this.width=width;
        this.height=height;
    }

    public DrawPanel()
    {
        this.color = Color.darkGray;
        this.width=this.getWidth();
        this.height=this.getHeight();
    }

    public void paintComponent(Graphics g)
    {
        g.setColor(color);
        g.fillRect(0, 0, width, height);
    }
}

и вот что я вижу при запуске: http://concertforhope.net/citeforme/javabug.png

Обратите внимание, что нижняя вкладка не прижата к верхней вкладке.

NVM, я понимаю почему. Вкладки были не такими маленькими, я заполнял фон неправильно (белые прямоугольники не отображали реальные вкладки). Спасибо за помощь.

Ответы [ 2 ]

4 голосов
/ 11 июня 2011

Вы также можете рассмотреть Использование невидимых компонентов в качестве наполнителя для управления вертикальным интервалом. Например, org.gcs.kinetic.ControlPanel использует Box.createVerticalStrut(), в то время как этот пример использует Box.createVerticalGlue().

4 голосов
/ 11 июня 2011

Это не ошибка. Предполагается, что boxlayout разделит все пространство поровну между компонентами.

Возможно, вы захотите, чтобы поток располагался вертикально или что-то в этом роде.

Я бы действительно посоветовал вам получить Google WindowBuilder (бесплатно) и немного поиграть с макетами в GUI.

В вашем особом случае вы также можете рассмотреть JTabbedPane с расположением табуляции справа.

...