В моем коде в настоящее время каждая карточка имеет размер моей рамки. Как установить разные размеры каждой из моих панелей в макете. Я попытался сделать фрейм разных размеров, вызвав метод run () и изменив размер фрейма, но это не сработало. Я надеюсь, что есть другой способ. Это мой код:
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import javax.swing.event.*;
public class GameManager
{
JFrame frame;
JPanel cards,Title;
public GameManager()
{
cards = new JPanel(new CardLayout());
Title title = new Title();
cards.add(title,"title");
CardLayout cl = (CardLayout)(cards.getLayout());
cl.show(cards, "title");
}
public static void main(String [] args)
{
GameManager gm = new GameManager();
gm.run();
}
public void run()
{
frame = new JFrame("Greek Olympics");
frame.setSize(1000,1000);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.getContentPane().add(cards);
frame.setVisible(true);
CardLayout cl = (CardLayout)(cards.getLayout());
cl.show(cards, "title");
}
public class Title extends JPanel
{
public void paintComponent(Graphics g)
{
super.paintComponent(g);
g.fillRect(100,100,100,100);
}
}
}
Как мне изменить код, чтобы добавить еще одну панель с другим размером?




How do I set different sizes of each of my panels in the layout
Во-первых, поймите, что CardLayout будет использовать свойство preferredSize всех представлений, которыми он управляет, для определения наилучшего результирующего размера, который должен использовать контейнер, которым он управляет. Это означает, что если вы вызываете pack в кадре (вместо setSize), он будет иметь размер (автоматически) для самого большого компонента, которым управлял (CardLayout).
How would I change the code so that if I wanted to add another panel with a different size?
Каждый компонент, который вы добавляете в CardLayout, должен либо рассчитывать свой размер с помощью одного или нескольких подходящих менеджеров компоновки, либо, в случае пользовательских компонентов, предоставлять подсказку по размеру с помощью метода getPreferredSize.
public class Title extends JPanel
{
@Override
public Dimension getPreferredSize() {
return new Dimension(200, 200);
}
@Override
protected void paintComponent(Graphics g)
{
super.paintComponent(g);
g.fillRect(100,100,100,100);
}
}
Затем вместо setSize используйте pack.
public void run()
{
frame = new JFrame("Greek Olympics");
//frame.setSize(1000,1000);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.add(cards);
frame.pack();
CardLayout cl = (CardLayout)(cards.getLayout());
cl.show(cards, "title");
frame.setVisible(true);
}
Это базовый пример, который устанавливает две панели: одну с preferredSize или 200x200, а другую - с 400x400.
Когда вы запустите его, вы обнаружите, что окно будет не меньше 400x400, и обе панели будут одинакового размера.
import java.awt.BorderLayout;
import java.awt.CardLayout;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.EventQueue;
import java.awt.GridBagLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.UIManager;
import javax.swing.UnsupportedLookAndFeelException;
public class Test {
public static void main(String[] args) {
new Test();
}
public Test() {
EventQueue.invokeLater(new Runnable() {
@Override
public void run() {
try {
UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
} catch (ClassNotFoundException | InstantiationException | IllegalAccessException | UnsupportedLookAndFeelException ex) {
ex.printStackTrace();
}
JFrame frame = new JFrame("Testing");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
CardLayout cardLayout = new CardLayout();
JPanel base = new JPanel(cardLayout);
base.add(makePanel(200, 200, Color.RED), "red");
base.add(makePanel(400, 400, Color.BLUE), "blue");
frame.add(base);
JButton blue = new JButton("Blue");
blue.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
cardLayout.show(base, "blue");
}
});
JButton red = new JButton("red");
red.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
cardLayout.show(base, "red");
}
});
JPanel buttons = new JPanel();
buttons.add(red);
buttons.add(blue);
frame.add(buttons, BorderLayout.SOUTH);
frame.pack();
frame.setLocationRelativeTo(null);
frame.setVisible(true);
}
});
}
public TestPane makePanel(int width, int height, Color background) {
TestPane pane = new TestPane(new Dimension(width, height));
pane.setBackground(background);
return pane;
}
public class TestPane extends JPanel {
private JLabel label;
private Dimension preferredSize;
public TestPane(Dimension size) {
label = new JLabel("...");
setLayout(new GridBagLayout());
add(label);
this.preferredSize = size;
}
@Override
public Dimension getPreferredSize() {
return preferredSize;
}
@Override
public void invalidate() {
super.invalidate();
label.setText(getWidth() + "x" + getHeight());
}
}
}
Основываясь на примере, размер кадра должен быть таким, чтобы он оборачивал компонент, который должен иметь размер 200x200 - дополнительные компоненты будут влиять на конечный размер кадра, обеспечивая максимальную ширину / высоту (в зависимости от их предпочтительных размеров) для всех управляемые компоненты - рамка не меняет размер для каждого вида, и я бы этого не делал, так как это раздражает
Я сделал ваш код, и фактический фрейм не виден. Я добавил, но рамка не отображается. Я неправильно реализовал?
import java.awt. *; import java.awt.event. *; import javax.swing. *; import javax.swing.event. *; открытый класс GameManager {JFrame frame; Карты JPanel, Экран заголовка, Экран событий, Запуск; общедоступный GameManager () {карты = новый JPanel (новый CardLayout ()); Заголовок экрана заголовка = новый экран заголовка (); cards.add (заголовок, «заголовок»); EventsScreen events = новый EventsScreen (); card.add (события, «события»); Бег бежать = новый Бег (); card.add (запустить, «бегать»); } public static void main (String [] args) {GameManager gm = new GameManager (); gm.run (); }
public void run () {frame = new JFrame («Греческие Олимпийские игры»); //frame.setSize(1000,750); frame.pack (); frame.setLocation (0,0); frame.setDefaultCloseOperation (JFrame.EXIT_ON_CLOSE); //frame.getContentPane().add(cards); frame.add (карты); frame.setVisible (правда); CardLayout cl = (CardLayout) (cards.getLayout ()); cl.show (карты, «титул»); }
открытый класс TitleScreen расширяет JPanel реализует MouseListener, MouseMotionListener {логическое playButtonClicked, howButtonClicked, play; int mouseX, mouseY; общедоступный TitleScreen () {playButtonClicked = howButtonClicked = play = false; mouseX = mouseY = 0; addMouseListener (это); addMouseMotionListener (это); } общественное измерение getPreferredSize () {вернуть новое измерение (400 400); }
Это весь мой код, что я делаю не так, что фрейм больше не виден?
@Anushka Комментарии не лучшее место для размещения кода - я обновил ответ работоспособным примером
Вроде ничего не меняет. К счастью, он компилируется, но размер кадра не меняется.