У меня возникли проблемы с изменением размера компонентов в графическом интерфейсе при изменении размера графического интерфейса. Прямо сейчас, когда я изменяю размер графического интерфейса, размер компонентов не меняется, они сохраняют статический размер, который я им установил. Когда я изменяю размер графического интерфейса, передающего минимальный размер, необходимый для их отображения, они больше не отображаются. Я хочу, чтобы они изменяли размер и сохраняли соотношение сторон при изменении размера графического интерфейса.
Вот код, который у меня есть для графического интерфейса:
import java.applet.*;
import java.awt.*;
import java.awt.event.*;
import java.awt.image.BufferedImage;
import java.awt.image.ImageObserver;
import java.io.*;
import java.net.*;
import javax.imageio.ImageIO;
import javax.swing.*;
import javax.swing.border.Border;
import javax.swing.text.*;
import javax.swing.text.html.*;
public class DraftGUI implements MouseListener {
private JPanel jpPack;
private JPanel jpCards;
private JPanel jpInfo;
private JPanel jpChat;
private TextField tf;
private StyledDocument doc;
private JTextPane tp;
private JScrollPane sp;
public void mousePressed(MouseEvent e) {
}
public void mouseReleased(MouseEvent e) {
}
public void mouseEntered(MouseEvent e) {
}
public void mouseExited(MouseEvent e) {
}
public void mouseClicked(MouseEvent e) {
e.getComponent().setVisible(false);
}
private Client client;
public GUI(Client client) throws IOException {
JFrame frame = new JFrame("Draft");
//set the size to fullscreen to start
frame.setSize(Toolkit.getDefaultToolkit().getScreenSize().width, Toolkit.getDefaultToolkit().getScreenSize().height);
//set the content pane, we'll add everything to it and then add it to the frame
JPanel contentPane = new JPanel();
contentPane.setSize(Toolkit.getDefaultToolkit().getScreenSize().width, Toolkit.getDefaultToolkit().getScreenSize().height);
contentPane.setLayout(new GridBagLayout());
//creates some panels with some default values for now
JPanel jpCards = new JPanel(new BorderLayout());
jpCards.setOpaque(true); //ensures it paints every pixel
jpCards.setBackground(Color.BLUE);
JPanel jpInfo = new JPanel();
jpInfo.setOpaque(true);
jpInfo.setBackground(Color.GREEN);
JPanel jpPack = new JPanel(new GridBagLayout());
jpPack.setOpaque(true);
jpPack.setBackground(Color.RED);
//grab some info to make the JTextPane and make it scroll
this.client = client;
tf = new TextField();
doc = new DefaultStyledDocument();
tp = new JTextPane(doc);
tp.setEditable(false);
tf.addActionListener(this.client);
sp = new JScrollPane(tp);
//adding the quantities to the chat panel
JPanel jpChat = new JPanel();
jpChat.setLayout(new BorderLayout());
jpChat.add("North", tf);
jpChat.add("Center", sp);
//a new GridBagConstraints used to set the properties/location of the panels
GridBagConstraints c = new GridBagConstraints();
//adding some panels to the content pane
//set it to start from the top left of the quadrant if it's too small
c.anchor = GridBagConstraints.FIRST_LINE_START;
c.fill = GridBagConstraints.BOTH; //set it to fill both vertically and horizontally
c.gridx = 0; //set it to quadrant x=0 and
c.gridy = 0; //set it to quadrant y=0
c.weightx = 0.7;
c.weighty = 0.3;
contentPane.add(jpCards, c);
c.gridx = 1;
c.gridy = 0;
c.weightx = 0.3;
c.weighty = 0.3;
contentPane.add(jpInfo, c);
c.gridx = 0;
c.gridy = 1;
c.weightx = 0.7;
c.weighty = 0.7;
contentPane.add(jpPack, c);
c.gridx = 1;
c.gridy = 1;
c.weightx = 0.3;
c.weighty = 0.7;
contentPane.add(jpChat, c);
//set some necessary values
frame.setContentPane(contentPane);
frame.setLocationByPlatform(true);
frame.setVisible(true);
//This code works for adding an Image
//need to learn how to specify a path not dependent on the specific users's machine
//this is not a high priority for now though
GridBagConstraints d = new GridBagConstraints();
d.gridx = 0;
d.gridy = 0;
ImageLabel imageLabel1 = new ImageLabel("path-to-file");
imageLabel1.setPreferredSize(new Dimension(223, 310));
jpPack.add(imageLabel1, d);
ImageLabel imageLabel2 = new ImageLabel("path-to-file");
imageLabel2.setPreferredSize(new Dimension(223, 310));
ImageLabel imageLabel3 = new ImageLabel("path-to-file");
imageLabel3.setPreferredSize(new Dimension(223, 310));
d.gridx = 1;
jpPack.add(imageLabel2, d);
d.gridy = 1;
jpPack.add(imageLabel3, d);
imageLabel1.addMouseListener(this);
imageLabel2.addMouseListener(this);
imageLabel3.addMouseListener(this);
//223, 310 are the aspect values for a card image, width, height
//these need to be maintained as the GUI size changes
}
}
class ImageLabel extends JLabel {
Image image;
ImageObserver imageObserver;
// constructor with filename
ImageLabel(String filename) {
ImageIcon icon = new ImageIcon(filename);
image = icon.getImage();
imageObserver = icon.getImageObserver();
}
// constructor with icon
ImageLabel(ImageIcon icon) {
image = icon.getImage();
imageObserver = icon.getImageObserver();
}
// overload setIcon method
void setIcon(ImageIcon icon) {
image = icon.getImage();
imageObserver = icon.getImageObserver();
}
// overload paint()
public void paint( Graphics g ) {
super.paint( g );
g.drawImage(image, 0 , 0 , getWidth() , getHeight() , imageObserver);
}
}
По какой-то причине для компонентов фрейма нет свойства изменения размера по умолчанию, поэтому при изменении размера фрейма компоненты ничего не делают. Я не уверен, что я делаю неправильно или пропустил, но явно что-то упустил.
Кроме того, если кто-нибудь знает, ImageLabels занимают дополнительное место вокруг себя. По умолчанию для заполнения установлено значение 0, поэтому я не уверен, почему оно создает вокруг них рамку.
Спасибо.
РЕДАКТИРОВАТЬ для Гийома:
Я знаю, что основной необходим, если я хочу запустить его как отдельное приложение, в настоящее время оно является частью другого приложения и вызывается отдельно из него. Вероятно, было не лучшим решением опубликовать его без основного для полноты картины, но в любом случае это не может быть такой уж большой проблемой.
Ваш код удалил ту часть, где изображение фактически отображалось. «путь к файлу» должен был быть заменен фактическим путем к файлу изображения, чтобы вы отображали изображение. На самом деле трудно увидеть проблему, когда это просто текст.
Когда изображение отображается правильно и вы пытаетесь изменить размер всего графического интерфейса, вы заметите, что изображение не сжимается. Он сохраняет свой предпочтительный размер и имеет проблемы, когда становится меньше, чем он. В моем коде он полностью перестает отображать изображение, когда оно не может отображать хотя бы предпочтительный размер. В вашем коде он обрезает часть картинки при сжатии.
Я хочу, чтобы он фактически изменил размер JLabel, содержащего изображение, чтобы по мере изменения размера графического интерфейса изменялось и изображение. Это необходимо, чтобы изображение уменьшалось соответственно для моей программы. Пользователь в конечном итоге получит функциональность, основанную на нажатии на изображения, поэтому отображение только некоторых изображений или их частей просто не годится.
Пожалуйста, попробуйте свой код/мой код еще раз и воспроизведите проблему, с которой я столкнулся, проверив с помощью изображений, чтобы мы могли найти правильное решение. Спасибо.