4

Swing と AWT を使用して Java GUI をハンドコーディングしようとしています。私はさまざまなレイアウトを使用して、または以下に投稿された GUI に似たものを試して達成しています (鉛筆で作成されたモックレイアウトです)。

モック レイアウト - (鉛筆で作成)

私がこれまでに得たものはこれですが、より「丁寧」で魅力的でユーザーフレンドリーにすることはできないようです.

Java GUI を試す

これは私がこれまでに行ったコードです:

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


public class GUI extends JFrame {

    public void buildGui() {

        JFrame frame = new JFrame("Hotel TV Scheduler");

                JPanel mainPanel = new JPanel();
        mainPanel.setLayout(new BorderLayout(0,0));

                JPanel chPanel = new JPanel();
                chPanel.setLayout(new GridLayout(3,2));

                JPanel listPanel = new JPanel();
                listPanel.setLayout(new GridLayout(3,2));

                JPanel infoPanel = new JPanel();
        infoPanel.setLayout(new GridLayout(0,2));


                JPanel addPanel = new JPanel();
        addPanel.setLayout(new GridLayout(0,3));


                mainPanel.add(chPanel, BorderLayout.LINE_START);
                mainPanel.add(listPanel, BorderLayout.CENTER);
                mainPanel.add(infoPanel, BorderLayout.LINE_END);


                JTable chOneTable = new JTable();
                JTable chTwoTable = new JTable();
                JTable listTable = new JTable();

                JLabel ch1Label = new JLabel("Channel 1");
                JLabel ch2Label = new JLabel("Channel 2");
                JLabel listLabel = new JLabel("List");

                JButton rmvChOneButton = new JButton("Remove Channel");
                JButton rmvChTwoButton = new JButton("Remove Channel");

                chPanel.add(ch1Label);
                chPanel.add(ch2Label);
                chPanel.add(chOneTable);
                 chPanel.add(chTwoTable);
                chPanel.add(rmvChOneButton);                                         
                chPanel.add(rmvChTwoButton);

                listPanel.add(listLabel);
                listPanel.add(listTable);                



                JLabel titleLabel = new JLabel("Title");
                JLabel genreLabel = new JLabel("Genre");
                JLabel durationLabel = new JLabel("Duration");
                JLabel actorLabel = new JLabel("Actor");
                JLabel directorLabel = new JLabel("Director");
                JLabel rentableLabel = new JLabel("Rentable");
                JLabel synLabel = new JLabel("Synopsis");

                JTextField txtTitle = new JTextField();          
                JTextField txtGenre = new JTextField();
                JTextField txtDuration = new JTextField();
                JTextField txtActor = new JTextField();
                JTextField txtDirector = new JTextField();
                JTextField txtSynopsis = new JTextField();

                JCheckBox rentCB = new JCheckBox();

                JButton btnAddProg = new JButton("Add Program");

                JList channelList = new JList();
                JList timeList = new JList();

                infoPanel.add(titleLabel);
                infoPanel.add(txtTitle);
                infoPanel.add(genreLabel);
                infoPanel.add(txtGenre);
                infoPanel.add(durationLabel);
                infoPanel.add(txtDuration);
                infoPanel.add(actorLabel);
                infoPanel.add(txtActor);
                infoPanel.add(directorLabel);
                infoPanel.add(txtDirector);
                infoPanel.add(rentableLabel);
                infoPanel.add(rentCB);
                infoPanel.add(synLabel);
                infoPanel.add(txtSynopsis);
                infoPanel.add(btnAddProg);
                infoPanel.add(channelList);
                infoPanel.add(timeList);


                frame.add(mainPanel);
                frame.setVisible(true);


    }


}

上記のモック レイアウトとまったく同じである必要はありませんが、可能な限り似ているか、少なくともユーザー フレンドリーです。

GridBagLayout と SwingLayout 以外を使用したい。

コードを改善し、より似たものにする方法についてのアイデアはありますか?

どんな助けでも大歓迎です。

ブライアン

4

4 に答える 4

2

MigLayoutを見てください。ライセンスは非常に包括的です。

MigLayoutは、商用および非商用プロジェクトに無料で使用でき、ソースコードが提供されています。非常に無料のBSDまたはGPLライセンスのどちらかお好みでライセンスされています

JNLPデモアプリケーションは、優れた例と対応するソースを表示する必要があります。

また、論理的に無関係なコンポーネントをネストしないようにしてください。入れ子の程度を増やすと、位置合わせ、境界線、およびパディングを取得するのが非常に困難になります。

于 2012-04-10T18:01:09.050 に答える
2

その GUI が主に必要とするものは次のとおりです。

  • コンポーネント間の空白。それを提供する 2 つの一般的な方法は次のとおりです。
    1. レイアウトのコンストラクターで提供されるレイアウト パディング。
    2. EmptyBorderコンポーネントまたはコンテナーへの の追加。すでに境界線を持っている多くのコンポーネントの場合、それらを でラップしJPanelてパネルに境界線を追加するのが最善です。
  • 制約パネル。EG コンポーネントのグループを '上部に押し込む' 必要がある場合はWESTBorderLayoutレイアウトBorderLayout.NORTH/制約 1 を使用して別のパネル内にそれらを追加します。これが私の言いたいことの例です。

于 2012-04-10T18:24:07.933 に答える
1

EclipseとWindowBuilderを使用します。後で戻って特定の部分を「ハンドコード」し、必要に応じてWindowBuilderに戻ることができます。

于 2012-04-10T17:36:41.543 に答える
1

このサンプル プログラムを見てください。これでニーズが満たされるでしょうか :-)

import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import javax.swing.border.TitledBorder;
import javax.swing.table.DefaultTableModel;

public class TVSchedule
{
    private static final int GAP = 5;
    private static TVSchedule tvSchedule;

    private void createAndDisplayGUI()
    {
        JFrame frame = new JFrame("HOTEL TV SCHEDULE");
        frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
        frame.setLocationByPlatform(true);

        JPanel contentPane = new JPanel();
        contentPane.setLayout(new BorderLayout());

        JPanel centerPanel = new JPanel();
        //centerPanel.setLayout(new FlowLayout(FlowLayout.LEFT, 5, 5));
        centerPanel.setLayout(new GridLayout(0, 4, 5, 5));
        centerPanel.add(createChannelOnePanel());
        centerPanel.add(createChannelTwoPanel());
        centerPanel.add(createListPanel());
        centerPanel.add(createInformationPanel());

        JPanel bottomPanel = new JPanel();
        bottomPanel.setOpaque(true);
        bottomPanel.setBackground(Color.RED.darker());
        bottomPanel.setLayout(new FlowLayout(FlowLayout.LEFT, 5, 5));
        JButton exitButton = new JButton("EXIT");
        bottomPanel.add(exitButton);

        contentPane.add(centerPanel, BorderLayout.CENTER);
        contentPane.add(bottomPanel, BorderLayout.PAGE_END);

        frame.setContentPane(contentPane);
        frame.pack();
        frame.setVisible(true);
    }

    private JPanel createChannelOnePanel()
    {
        JPanel panel = new JPanel();
        panel.setLayout(new GridBagLayout());
        panel.setOpaque(true);
        panel.setBackground(Color.DARK_GRAY);
        panel.setBorder(BorderFactory.createEmptyBorder(GAP, GAP, GAP, GAP));
        GridBagConstraints gbc = new GridBagConstraints();

        String[] columnNames = {
                                    "Time",
                                    "Title"
                               }; 
        Object[][] data = {
                            {"01:00","Cowboy and Alchemist."}
                          };
        DefaultTableModel model = new DefaultTableModel(data, columnNames);
        JTable table = new JTable( model )
        {
            //  Returning the Class of each column will allow different
            //  renderers to be used based on Class
            public Class getColumnClass(int column)
            {
                return getValueAt(0, column).getClass();
            }
        };                      

        table.setPreferredScrollableViewportSize(new Dimension(200, 200));
        table.setFillsViewportHeight(true);
        JScrollPane scrollPane = new JScrollPane(table);
        scrollPane.setBorder(BorderFactory.createTitledBorder(
                        BorderFactory.createLineBorder(Color.BLACK, 1)
                        , "Channel 1"
                        , TitledBorder.CENTER
                        , TitledBorder.DEFAULT_POSITION));      
        gbc.weightx = 1.0;
        gbc.fill = GridBagConstraints.HORIZONTAL;
        gbc.gridx = 0;
        gbc.gridy = 0;
        gbc.gridwidth = 2;
        panel.add(scrollPane, gbc);     

        JButton removeButton = new JButton("Remove Selected");
        gbc.weightx = 1.0;
        gbc.gridx = 0;
        gbc.gridy = 3;
        gbc.gridwidth = 2;
        panel.add(removeButton, gbc);

        return panel;
    }

    private JPanel createChannelTwoPanel()
    {
        JPanel panel = new JPanel();
        panel.setLayout(new GridBagLayout());
        panel.setOpaque(true);
        panel.setBackground(Color.WHITE);
        panel.setBorder(BorderFactory.createEmptyBorder(GAP, GAP, GAP, GAP));
        GridBagConstraints gbc = new GridBagConstraints();

        String[] columnNames = {
                                    "Time",
                                    "Title"
                               }; 
        Object[][] data = {
                            {"02:00","Grey's Anatomy"}
                          };
        DefaultTableModel model = new DefaultTableModel(data, columnNames);
        JTable table = new JTable( model )
        {
            //  Returning the Class of each column will allow different
            //  renderers to be used based on Class
            public Class getColumnClass(int column)
            {
                return getValueAt(0, column).getClass();
            }
        };                      

        table.setPreferredScrollableViewportSize(new Dimension(200, 200));
        table.setFillsViewportHeight(true);
        JScrollPane scrollPane = new JScrollPane(table);
        scrollPane.setBorder(BorderFactory.createTitledBorder(
                        BorderFactory.createLineBorder(Color.BLACK, 1)
                        , "Channel 2"
                        , TitledBorder.CENTER
                        , TitledBorder.DEFAULT_POSITION));      
        gbc.weightx = 1.0;
        gbc.fill = GridBagConstraints.HORIZONTAL;
        gbc.gridx = 0;
        gbc.gridy = 0;
        gbc.gridwidth = 2;
        panel.add(scrollPane, gbc);     

        JButton removeButton = new JButton("Remove Selected");
        gbc.weightx = 1.0;
        gbc.gridx = 0;
        gbc.gridy = 3;
        gbc.gridwidth = 2;
        panel.add(removeButton, gbc);

        return panel;
    }

    private JPanel createListPanel()
    {       
        JPanel panel = new JPanel();
        panel.setLayout(new GridBagLayout());
        panel.setOpaque(true);
        panel.setBackground(Color.DARK_GRAY);
        panel.setBorder(BorderFactory.createEmptyBorder(GAP, GAP, GAP, GAP));
        GridBagConstraints gbc = new GridBagConstraints();

        String[] columnNames = {
                                    "Genre",
                                    "Title",
                                    "Duration (Hours)"
                               }; 
        Object[][] data = {
                            {"Comedy","C & A", "1.5"}
                          };
        DefaultTableModel model = new DefaultTableModel(data, columnNames);
        JTable table = new JTable( model )
        {
            //  Returning the Class of each column will allow different
            //  renderers to be used based on Class
            public Class getColumnClass(int column)
            {
                return getValueAt(0, column).getClass();
            }
        };                      

        table.setPreferredScrollableViewportSize(new Dimension(200, 200));
        table.setFillsViewportHeight(true);
        JScrollPane scrollPane = new JScrollPane(table);
        scrollPane.setBorder(BorderFactory.createTitledBorder(
                        BorderFactory.createLineBorder(Color.BLACK, 1)
                        , "List"
                        , TitledBorder.CENTER
                        , TitledBorder.DEFAULT_POSITION));
        gbc.weightx = 1.0;
        gbc.anchor = GridBagConstraints.PAGE_START;
        gbc.fill = GridBagConstraints.HORIZONTAL;
        gbc.gridx = 0;
        gbc.gridy = 0;
        gbc.gridwidth = 2;
        panel.add(scrollPane, gbc); 

        gbc.weightx = 1.0;
        gbc.gridx = 0;
        gbc.gridy = 3;
        gbc.gridwidth = 2;
        panel.add(Box.createRigidArea(new Dimension(100, 30)), gbc);    

        return panel;
    }

    private JPanel createInformationPanel()
    {
        JPanel bottomPanel = new JPanel();
        bottomPanel.setLayout(new GridLayout(0, 1, 2, 2));
        bottomPanel.setBorder(BorderFactory.createTitledBorder(
                        BorderFactory.createLineBorder(Color.BLACK, 1)
                        , "Information"
                        , TitledBorder.LEFT
                        , TitledBorder.DEFAULT_POSITION));

        JPanel panel = new JPanel();
        panel.setOpaque(true);
        panel.setBackground(Color.WHITE);
        panel.setLayout(new GridBagLayout());
        panel.setBorder(BorderFactory.createEmptyBorder(GAP, GAP, GAP, GAP));
        GridBagConstraints gbc = new GridBagConstraints();

        JLabel titleLabel = new JLabel("TITLE : ");
        gbc.fill = GridBagConstraints.HORIZONTAL;
        gbc.gridx = 0;
        gbc.gridy = 0;
        panel.add(titleLabel, gbc);

        JTextField titleField = new JTextField(10);
        gbc.gridx = 1;
        panel.add(titleField, gbc);

        JLabel genreLabel = new JLabel("GENRE : ");
        gbc.gridx = 0;
        gbc.gridy = 1;
        panel.add(genreLabel, gbc);

        JTextField genreField = new JTextField(10);
        gbc.gridx = 1;
        panel.add(genreField, gbc);

        JLabel durationLabel = new JLabel("DURATION : ");
        gbc.gridx = 0;
        gbc.gridy = 2;
        panel.add(durationLabel, gbc);

        JTextField durationField = new JTextField(10);
        gbc.gridx = 1;
        panel.add(durationField, gbc);

        JLabel actorLabel = new JLabel("ACTOR : ");
        gbc.gridx = 0;
        gbc.gridy = 3;
        panel.add(actorLabel, gbc);

        JTextField actorField = new JTextField(10);
        gbc.gridx = 1;
        panel.add(actorField, gbc);

        JLabel directorLabel = new JLabel("DIRECTOR : ");
        gbc.gridx = 0;
        gbc.gridy = 4;
        panel.add(directorLabel, gbc);

        JTextField directorField = new JTextField(10);
        gbc.gridx = 1;
        panel.add(directorField, gbc);

        JLabel rentLabel = new JLabel("RENTABLE : ");
        gbc.gridx = 0;
        gbc.gridy = 5;
        panel.add(rentLabel, gbc);

        JCheckBox rentCBox = new JCheckBox(" ", false);
        rentCBox.setOpaque(true);
        rentCBox.setBackground(Color.WHITE);
        rentCBox.setHorizontalTextPosition(SwingConstants.LEFT);
        gbc.gridx = 1;
        panel.add(rentCBox, gbc);

        JLabel synopsisLabel = new JLabel("SYNOPSIS : ");
        gbc.gridx = 0;
        gbc.gridy = 6;
        panel.add(synopsisLabel, gbc);

        JTextArea synopsisArea = new JTextArea(10, 5);
        synopsisArea.setBackground(Color.BLUE.darker());
        synopsisArea.setForeground(Color.WHITE);
        synopsisArea.setCaretColor(Color.WHITE);
        gbc.gridx = 1;
        gbc.gridwidth = 2;
        gbc.gridheight = 2;
        panel.add(synopsisArea, gbc);

        JButton addProgramButton = new JButton("Add Program");
        gbc.gridx = 0;
        gbc.gridy = 8;
        gbc.insets = new Insets(5, 5, 5, 5);
        gbc.anchor = GridBagConstraints.PAGE_END;
        gbc.gridwidth = 1;
        gbc.gridheight = 1;
        panel.add(addProgramButton, gbc);

        JSpinner spinner = new JSpinner(new SpinnerNumberModel(00.15, 00.15, 60.00, 00.15));
        gbc.gridx = 2;
        gbc.gridy = 8;      
        panel.add(spinner, gbc);

        bottomPanel.add(panel);
        return bottomPanel;
    }

    public static void main(String... args)
    {
        SwingUtilities.invokeLater(new Runnable()
        {
            public void run()
            {
                tvSchedule = new TVSchedule();
                tvSchedule.createAndDisplayGUI();
            }
        });
    }
}

私はあなたが「JSpinner」との間で何を使用しているのか本当に知りませんJButton。そのため、そこに何も追加しなかったのです。

同じの出力は次のとおりです。

ホテルTVスケジュール

于 2012-04-11T07:31:08.513 に答える