Окно не изменяет размеры

1

Я пишу метод для отображения и изменения размера окна, но по какой-то причине он не изменяет его размер.

static void frame(JFrame f) {

    JFrame frame = f;
    int frameWidth = 500;
    int frameHeight = 500;
    Dimension screenSize = Toolkit.getDefaultToolkit().getScreenSize();
    frame.setBounds((int) screenSize.getWidth() - frameWidth, 0, frameWidth, frameHeight);
    frame.setLocationRelativeTo(null);
    frame.setBackground(Color.WHITE);
    frame.setVisible(true);
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
}

Вот мой метод рисования:

package events;

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

public class P extends JPanel {

static P g = new P();
int x = 500;
int y = 500;

@Override
public Dimension getPreferredSize() {
    return new Dimension(x, y);

}

public void paintComponent(Graphics g) {

    super.paintComponent(g);

}

}

И это в моем основном методе:

    frame.add(P.g);
    P.g.setLayout(null);
    text[0] = new JTextArea(0, 0);
    text[0].setLineWrap(true);
    text[0].setEditable(false);
    JScrollPane scroll = new JScrollPane(text[0]);

    scroll.setBounds(20, 20, 450, 110);
    P.g.add(scroll);

    frame(frame);
  • 0
    Вы можете просто использовать setExtendedState и передать его MAXIMIZED_BOTH, который работает в системах с несколькими мониторами и учитывает такие вещи, как панель задач или док-станция. Не звонить нигде?
  • 0
    Почему вы устанавливаете положение своего кадра с помощью первых двух аргументов setBounds , когда после этого вы используете setLocationRelativeTo(null) который меняет положение вашего кадра на центр экрана?
Показать ещё 4 комментария
Теги:
swing

1 ответ

1
Лучший ответ

В этом коде мы видим два важных момента:

  • Статическое использование переменной P g = new P()
  • Нет вызова (ссылки) на JFrame.pack()

Прежде всего, переменная P g = new P() была инициализирована, однако в этом коде я не могу никого настраивать для WIDTH и HEIGTH, связанных с предпочтительным размером. Как второй момент, в этом коде нет ссылки на JFrame.pack(), первоначально унаследованный от java.awt.Window.pack(). Этот метод важен, потому что он используется в Windows и Frames, чтобы их размер соответствовал предпочтительным размерам и макетам его подкомпонентов. Метод pack() это не только один способ настройки фреймов. См. Цитату, доступную в документации Oracle ниже:

Альтернативой пакету является установка размера фрейма явным путем вызова setSize или setBounds (который также устанавливает местоположение фрейма). В общем случае использование пакета предпочтительнее вызова setSize, поскольку пакет оставляет диспетчер компоновки фреймов, отвечающий за размер кадра, а менеджеры макетов хорошо подходят для зависимостей платформы и других факторов, влияющих на размер компонента.

Некоторые полезные ссылки:


package sample;

import java.awt.Color;
import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.Toolkit;
import javax.swing.JFrame;
import javax.swing.JPanel;

class P extends JPanel {
    static P g = new P();
    int x = 500;
    int y = 500;

    @Override
    public Dimension getPreferredSize() {
        return new Dimension(x, y);

    }

    @Override
    public void paintComponent(Graphics g) {
        super.paintComponent(g);
    }
}

public class MyFrame extends javax.swing.JFrame {
    public MyFrame() { }
    static void frame(JFrame f) {
        JFrame frame = f;
        int frameWidth = 500;
        int frameHeight = 500;
        Dimension screenSize = Toolkit.getDefaultToolkit().getScreenSize();
        frame.setBounds((int) screenSize.getWidth() - frameWidth, 0, frameWidth, frameHeight);
        frame.setLocationRelativeTo(null);
        frame.setBackground(Color.WHITE);
        frame.setVisible(true);
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    }
    public static void main(String args[]) {

        // 1. creating the frame window
        //
        MyFrame myFrame = new MyFrame();
        myFrame.add( P.g );
        P.g.setLayout( null );

        // others usefull  operations
        // configuring others objetcs
        // to be added on P.g

        // text[0] = new JTextArea(0, 0);
        // text[0].setLineWrap(true);
        // text[0].setEditable(false);
        // JScrollPane scroll = new JScrollPane(text[0]);
        // P.g.add(scroll);

        // 2. setting preferred size
        Dimension preferredSize = P.g.getPreferredSize();
        myFrame.setPreferredSize(preferredSize);

        // 3. need apply the pack method (here or any other place)
        // calling your method frame(JFrame)
        frame(myFrame);

        myFrame.setVisible( true );
        myFrame.pack();   
    }             
}

Может быть, может быть выбрано исключение RT как исключение NullPointerException из-за зависимых от Plataform проблем или из-за вопросов безопасности. Смотри ниже:

Exception in thread "AWT-EventQueue-0" java.lang.NullPointerException
at events.P.paintComponent(P.java:82)
at javax.swing.JComponent.paint(Unknown Source)
at javax.swing.JComponent.paintChildren(Unknown Source)
at javax.swing.JComponent.paint(Unknown Source)
at javax.swing.JComponent.paintChildren(Unknown Source)
at javax.swing.JComponent.paint(Unknown Source)
at javax.swing.JLayeredPane.paint(Unknown Source)
at javax.swing.JComponent.paintChildren(Unknown Source)
at javax.swing.JComponent.paintToOffscreen(Unknown Source)
at javax.swing.BufferStrategyPaintManager.paint(Unknown Source)
at javax.swing.RepaintManager.paint(Unknown Source)
at javax.swing.JComponent.paint(Unknown Source)
at java.awt.GraphicsCallback$PaintCallback.run(Unknown Source)
at sun.awt.SunGraphicsCallback.runOneComponent(Unknown Source)
at sun.awt.SunGraphicsCallback.runComponents(Unknown Source)
at java.awt.Container.paint(Unknown Source)
at java.awt.Window.paint(Unknown Source)
at javax.swing.RepaintManager$4.run(Unknown Source)
at javax.swing.RepaintManager$4.run(Unknown Source)
at java.security.AccessController.doPrivileged(Native Method)
at java.security.ProtectionDomain$1.doIntersectionPrivilege(Unknown Source)
at javax.swing.RepaintManager.paintDirtyRegions(Unknown Source)
at javax.swing.RepaintManager.paintDirtyRegions(Unknown Source)
at javax.swing.RepaintManager.prePaintDirtyRegions(Unknown Source)
at javax.swing.RepaintManager.access$1300(Unknown Source)
at javax.swing.RepaintManager$ProcessingRunnable.run(Unknown Source)
at java.awt.event.InvocationEvent.dispatch(Unknown Source)
at java.awt.EventQueue.dispatchEventImpl(Unknown Source)
at java.awt.EventQueue.access$400(Unknown Source)
at java.awt.EventQueue$3.run(Unknown Source)
at java.awt.EventQueue$3.run(Unknown Source)
at java.security.AccessController.doPrivileged(Native Method)
at java.security.ProtectionDomain$1.doIntersectionPrivilege(Unknown Source)
at java.awt.EventQueue.dispatchEvent(Unknown Source)
at java.awt.EventDispatchThread.pumpOneEventForFilters(Unknown Source)
at java.awt.EventDispatchThread.pumpEventsForFilter(Unknown Source)
at java.awt.EventDispatchThread.pumpEventsForHierarchy(Unknown Source)
at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
at java.awt.EventDispatchThread.run(Unknown Source)

Таким образом, его можно исправить с помощью очереди через EventQueue более подробную информацию можно найти в Oracle Docs

Устраните проблему, обернув код внутри основного метода EventQueue соответствии с приведенным ниже кодом:

public static void main(String args[]) {

    java.awt.EventQueue.invokeLater(new Runnable() {
        @Override
        public void run() {

            // 1. creating the frame window
            //
            MyFrame myFrame = new MyFrame();
            myFrame.add( P.g );
            P.g.setLayout( null );

            // others usefull  operations
            // configuring others objetcs
            // to be added on P.g

            // text[0] = new JTextArea(0, 0);
            // text[0].setLineWrap(true);
            // text[0].setEditable(false);
            // JScrollPane scroll = new JScrollPane(text[0]);
            // P.g.add(scroll);

            // 2. setting preferred size
            Dimension preferredSize = P.g.getPreferredSize();
            myFrame.setPreferredSize(preferredSize);

            // 3. need apply the pack method (here or any other place)
            // calling your method frame(JFrame)
            frame(myFrame);

            myFrame.setVisible( true );
            myFrame.pack();   

        }
    });

}     

PS: @Skillet, извините за любую неверную интерпретацию кода, который вы предоставили.

  • 0
    Это выдает исключение, когда я попробовал это.
  • 0
    @Skillet вы можете поместить информацию об исключении, пожалуйста? Меня устраивает.
Показать ещё 4 комментария

Ещё вопросы

Сообщество Overcoder
Наверх
Меню