Скрыть кнопки в строке заголовка в Java - PullRequest
2 голосов
/ 20 февраля 2012

В Jinternal Frame (java) я хочу скрыть кнопки max, min, close (не отключать свойства max, min, close), но когда я использовал этот код:

javax.swing.plaf.InternalFrameUI ifu= jif.getUI(); //jif : finternalframe//
((javax.swing.plaf.basic.BasicInternalFrameUI)ifu).setNorthPane(null);

Он сделал всекнопки и строка заголовка исчезли (представьте, что внутренний кадр - это треугольник, поэтому видны только 3 стороны (вниз, влево и вправо).

Итак, как я могу скрыть только 3 кнопки макс, мин и закрыть, не скрывая всестрока заголовка?Спасибо.

Ответы [ 4 ]

3 голосов
/ 20 февраля 2012

.. хочу скрыть макс, мин, кнопку закрытия

RemoveControls

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

class RemoveControls {

    public static void main(String[] args) {
        SwingUtilities.invokeLater(new Runnable() {
            public void run() {
                JPanel p = new JPanel(new GridLayout());
                p.setPreferredSize(new Dimension(300,120));

                JDesktopPane dtp = new JDesktopPane();
                p.add(dtp);

                JInternalFrame jif = new JInternalFrame("JIF",
                    false, //resizable
                    false, //closable
                    false, //maximizable
                    false); //iconifiable
                jif.setVisible(true);
                jif.setSize(200,100);
                dtp.add(jif);

                JOptionPane.showMessageDialog(null, p);
            }
        });
    }
}
1 голос
/ 20 февраля 2012
0 голосов
/ 05 июня 2015

К сожалению, вы не можете скрыть эти кнопки.Я тоже это попробовал и не увенчался успехом.Однако для этого есть обходной путь, заключающийся в создании пользовательской строки заголовка.Это довольно утомительно, но работает.

Следующие шаги должны помочь вам:

1) вызвать метод setUndecorated(true).К сожалению, это полностью удалит строку заголовка, но позволит вам выполнить шаг 2.

2) Затем создайте класс, который позволит вам создать строку заголовка, используя JFrame.Имейте в виду, что кнопки окна отображаются справа для ОС Windows и слева для Mac OS.Текст заголовка также центрируется на Mac и выравнивается по левому краю в Windows.

3) Используйте JLabel, чтобы отобразить текст заголовка, и JButton, чтобы отобразить кнопки, свернуть, развернуть и закрыть.Я также рекомендовал бы сгруппировать кнопки и расположить текст заголовка так, чтобы строка заголовка выглядела так же, как та, которую ОС на вашем компьютере отображает

4) [Необязательно] Вы можете прикрепить ActionListener к кнопкам, чтобывизуализировать поведение окна.Это включает setState() для минимизации и setExtendedState для максимизации.Закрытие окна дает вам две опции System.exit(0) для приложений и dispose() для апплетов

5) [Также необязательно], чтобы отключить кнопки, просто используйте метод setEnabled(false).В вашем случае, чтобы скрыть эти кнопки, вы должны использовать setVisible(false)

Следующий фрагмент кода демонстрирует это:

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

class TitleBar extends JPanel
{
    private JLabel titleLabel; //create this to hold the title text

    JFrame frame    = new JFrame();

    int pX, pY; //used for window dragging

    private JButton closeBtn, minBtn, maxBtn; //create these for the window buttons

    public TitleBar(String title)
    {
        setPreferredSize(new Dimension(1000, 28));

        titleLabel = new JLabel(title);
        titleLabel.setOpaque(true);

        JPanel controls = new JPanel(new FlowLayout(FlowLayout.LEFT, 0, 0)); //define this to hold the title text and window buttons

        closeBtn    = new JButton(); //define the Close button
        closeBtn.setBorderPainted(false);

        //set the icons for the states
        closeBtn.setIcon(new WindowButtonIcon().new CloseIcon(true, false));
        closeBtn.setPressedIcon(new WindowButtonIcon().new CloseIcon(true, true));
        closeBtn.setDisabledIcon(new WindowButtonIcon().new CloseIcon(false, false));

        //Apply the more fine adjustments
        closeBtn.setPreferredSize(new Dimension(17, 17));
        closeBtn.setRolloverEnabled(false);
        closeBtn.setFocusPainted(false);

        //Attach this action listener to render the "close window" function
        closeBtn.addActionListener(new ActionListener()
        {
            public void actionPerformed(ActionEvent e)
            {
                System.exit(0);
            }
        });

        minBtn      = new JButton(); // define the Minimize button
        minBtn.setBorderPainted(false);

        //set the icons for the selection states
        minBtn.setIcon(new WindowButtonIcon().new MinimizeIcon(true, false));
        minBtn.setPressedIcon(new WindowButtonIcon().new MinimizeIcon(true, true));
        minBtn.setDisabledIcon(new WindowButtonIcon().new MinimizeIcon(false, false));

        //Apply the more fine adjustments
        minBtn.setPreferredSize(new Dimension(17, 17));
        minBtn.setRolloverEnabled(false);
        minBtn.setFocusPainted(false);

        maxBtn      = new JButton(); //define the Maximize button
        maxBtn.setBorderPainted(false);

        //set the icons for the selection states
        maxBtn.setIcon(new WindowButtonIcon().new MaximizeIcon(true, false));
        maxBtn.setPressedIcon(new WindowButtonIcon().new MaximizeIcon(true, true));
        maxBtn.setDisabledIcon(new WindowButtonIcon().new MaximizeIcon(false, false));

        //Apply the more fine adjustments
        maxBtn.setPreferredSize(new Dimension(17, 17));
        maxBtn.setRolloverEnabled(false);
        maxBtn.setFocusPainted(false);

        //This JPanel will set up the title text and window buttons
        controls.setBackground(null);
        controls.add(minBtn);
        controls.add(Box.createRigidArea(new Dimension(4, 0)));
        controls.add(maxBtn);
        controls.add(Box.createRigidArea(new Dimension(4, 0)));
        controls.add(closeBtn);

        setLayout(new FlowLayout(FlowLayout.LEFT, 0, 3));

        //construct the custom title bar
        add(titleLabel);
        add(Box.createRigidArea(new Dimension(790, 0)));
        add(controls);

        //These render window dragging
        addMouseListener(new MouseAdapter()
        {
            public void mousePressed(MouseEvent me)
            {
                // Get x,y and store them
                pX = me.getX();
                pY = me.getY();
            }

            public void mouseDragged(MouseEvent me)
            {
                frame.setLocation(frame.getLocation().x + me.getX() - pX, frame.getLocation().y + me.getY() - pY);
            }
        });

        addMouseMotionListener(new MouseMotionAdapter()
        {
            public void mouseDragged(MouseEvent me)
            {
                frame.setLocation(frame.getLocation().x + me.getX() - pX, frame.getLocation().y + me.getY() - pY);
            }
        });
    }
}

Этот класс создает строку заголовка в представлении Windows.Обратите внимание, что использованный здесь класс Icon не указан, однако вы можете создать класс, который может отображать его.

Слушатели MouseEvent являются обязательными, если вы хотите перетаскивать окно.

Прослушиватель ActionEvent для кнопки закрытия также является обязательным требованием, если вы хотите закрыть окно.Скрытие и отключение этой кнопки естественным образом отключит эту функцию

Надеюсь, это поможет.

0 голосов
/ 10 октября 2014

Если вы используете netbeans, это просто. Просто создайте новую JInternalFrameForm, щелкнув правой кнопкой мыши на любом вашем пакете.

Просто добавьте эту JInternalFrameForm в любой из ваших контейнеров (например, на панель рабочего стола).

Мое имя JInternalFrameForm является внутренним1, а имя моей панели рабочего стола - desk.

// псевдокод:

    InternalFrame mboxFrame = new internal1();
    mboxFrame.setResizable(false);
    mboxFrame.setSize(desk.getWidth(), desk.getHeight());
    mboxFrame.setLocation(0, 0);
    mboxFrame.setVisible(true);
    desk.add(mboxFrame);
...