Я пишу метод для отображения и изменения размера окна, но по какой-то причине он не изменяет его размер.
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);
В этом коде мы видим два важных момента:
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, извините за любую неверную интерпретацию кода, который вы предоставили.
setBounds
, когда после этого вы используетеsetLocationRelativeTo(null)
который меняет положение вашего кадра на центр экрана?