gpt4 book ai didi

java - 在框架调整大小 Java 上调整组件大小

转载 作者:塔克拉玛干 更新时间:2023-11-02 08:20:31 25 4
gpt4 key购买 nike

我在调整 GUI 大小时尝试调整 GUI 中组件的大小时遇到​​了一些问题。现在,当我调整 GUI 大小时,组件的大小没有改变,它们保持为我设置的静态大小。当我调整 GUI 的大小超过显示它们所需的最小尺寸时,它们将不再显示。我希望它们在调整 GUI 大小时调整大小并保持纵横比。

这是我的 GUI 代码:

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);

}

}

由于某些原因,框架组件没有默认的调整大小属性,因此当框架调整大小时,组件不会执行任何操作。我不确定我做错了什么或错过了什么,但显然我遗漏了一些东西。

此外,如果有人知道,ImageLabel 会占用它们周围的额外空间。默认情况下,填充设置为 0,所以我不确定为什么它会在它们周围创建一个边框。

谢谢。

为纪尧姆编辑:

我知道如果我想将它作为独立运行,则 main 是必需的,它目前是另一个应用程序的一部分,并从它内部单独调用。为了完整性而在没有 main 的情况下发布它可能不是最好的决定,但无论如何,这不是什么大问题。

你的代码把图片实际显示的部分去掉了。 “文件路径”应该被替换为实际的图像文件路径,因此您可以显示图像。当它只是文本时,很难真正看到手头的问题。

当您正确显示图像并尝试调整整个 GUI 的大小时,您会注意到图像没有缩小。它保持其首选大小,并且当它变得小于它时会出现问题。在我的代码中,当它不能至少显示首选尺寸时,它会完全停止显示图片。在您的代码中,它在缩小时切断了部分图片。

我想要的是它实际调整包含图片的 JLabel 的大小,以便随着 GUI 调整大小,图像也会调整大小。对于我的程序,图像有必要相应地缩小。用户最终将拥有基于单击图像的功能,因此仅显示部分图像或部分图像根本行不通。

请再次尝试你的代码/我的代码并重现我遇到的问题,用图片测试,以便我们找到正确的解决方案。谢谢。

最佳答案

  1. JFrame.setVisible(true) 应该是您调用的最后一行。
  2. GridBagLayout 可以根据框架大小调整组件的大小,只要您使用 weightx/weightyfill<

更新:

  1. 忘记设置首选大小,这只会导致 GUI 问题
  2. 如果您使用 LayoutManager(这是一个非常好的主意),请忘记调用 setSize()/setBounds()/setLocation(),LayoutManager 无论如何都会覆盖它们
  3. 您需要注意调整图像大小以保持原始图像比例
  4. 如果您使用 weightx/weighty,您还应该使用 anchor 和/或 fill
  5. 使用 frame.pack() 调整框架的大小
  6. 使用setExtendedState() 最大化帧

顺便说一句,SSCCE意味着您为其他人制作了一个可运行的示例,这包括将图像的本地路径更改为在线 URL(请参见下面的示例)。

使用以下代码片段,一切似乎都正常:

import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
import java.awt.TextField;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.net.MalformedURLException;
import java.net.URL;

import javax.swing.ImageIcon;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTextPane;
import javax.swing.SwingUtilities;
import javax.swing.text.DefaultStyledDocument;
import javax.swing.text.StyledDocument;

public class DraftGUI implements MouseListener {

private static final String IMAGE_URL = "http://images.paramountbusinessjets.com/space/spaceshuttle.jpg";
private JPanel jpPack;
private JPanel jpCards;
private JPanel jpInfo;
private JPanel jpChat;
private TextField tf;
private StyledDocument doc;
private JTextPane tp;
private JScrollPane sp;

@Override
public void mousePressed(MouseEvent e) {
}

@Override
public void mouseReleased(MouseEvent e) {
}

@Override
public void mouseEntered(MouseEvent e) {
}

@Override
public void mouseExited(MouseEvent e) {
}

@Override
public void mouseClicked(MouseEvent e) {
}

public DraftGUI() throws MalformedURLException {

final JFrame frame = new JFrame("Draft");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
// set the content pane, we'll add everything to it and then add it to the frame
JPanel contentPane = new JPanel();
contentPane.setLayout(new GridBagLayout());

// creates some panels with some default values for now
JPanel jpCards = new JPanel(new BorderLayout());
jpCards.setBackground(Color.BLUE);

JPanel jpInfo = new JPanel();
jpInfo.setBackground(Color.GREEN);

JPanel jpPack = new JPanel(new GridBagLayout());
jpPack.setBackground(Color.RED);

// grab some info to make the JTextPane and make it scroll
tf = new TextField();
doc = new DefaultStyledDocument();
tp = new JTextPane(doc);
tp.setEditable(false);
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);

// 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.weightx = 1.0;
d.weighty = 1.0;
d.fill = GridBagConstraints.BOTH;
d.gridx = 0;
d.gridy = 0;
ImageLabel imageLabel1 = new ImageLabel(new ImageIcon(new URL(IMAGE_URL)));
jpPack.add(imageLabel1, d);
ImageLabel imageLabel2 = new ImageLabel(new ImageIcon(new URL(IMAGE_URL)));
d.gridx++;
jpPack.add(imageLabel2, d);

ImageLabel imageLabel3 = new ImageLabel(new ImageIcon(new URL(IMAGE_URL)));
d.gridy++;
jpPack.add(imageLabel3, d);

imageLabel1.addMouseListener(this);
imageLabel2.addMouseListener(this);
imageLabel3.addMouseListener(this);
frame.pack();
// 223, 310 are the aspect values for a card image, width, height
// these need to be maintained as the GUI size changes
frame.setExtendedState(frame.getExtendedState() | JFrame.MAXIMIZED_BOTH);
frame.setVisible(true);
}

public static void main(String[] args) {
SwingUtilities.invokeLater(new Runnable() {
@Override
public void run() {
try {
new DraftGUI();
} catch (MalformedURLException e) {
e.printStackTrace();
}
}
});
}

public static class ImageLabel extends JPanel {
private static int counter = 1;
private ImageIcon icon;
private int id = counter++;

public ImageLabel(ImageIcon icon) {
super();
setOpaque(false);
this.icon = icon;
}

@Override
public Dimension getPreferredSize() {
return new Dimension(icon.getIconWidth(), icon.getIconHeight());
}

@Override
protected void paintComponent(Graphics g) {
super.paintComponent(g);
double zoom = Math.min((double) getWidth() / icon.getIconWidth(), (double) getHeight() / icon.getIconHeight());
int width = (int) (zoom * icon.getIconWidth());
int height = (int) (zoom * icon.getIconHeight());
g.drawImage(icon.getImage(), (getWidth() - width) / 2, (getHeight() - height) / 2, width, height, this);
g.setFont(g.getFont().deriveFont(36.0f));
g.drawString(String.valueOf(id), getWidth() / 2, getHeight() / 2);
}
}
}

关于java - 在框架调整大小 Java 上调整组件大小,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13040747/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com