Сначала я признаю, что я очень новичок в кодировании GUI с Swing, поэтому, пожалуйста, имейте это в виду.Изображения, складывающиеся на вершине eachother несмотря на flowlayout?
Я создал графический интерфейс, состоящий из JPanel сверху, который должен отображать изображения, а один из дна, содержащий несколько компонентов GUI, составляющих чат. У меня в чате все позаботились (хотя вы можете указать на ошибки и улучшения). Я сейчас беспокоюсь об обращении с изображениями в верхней JPanel.
Мое понимание заключается в том, что при работе с изображениями разумно расширять JPanel до нового класса, который рисует изображения в графическом интерфейсе. Я написал такой класс, основанный на другие ответы я нашел на этом сайте:
class ImgPanel extends JPanel
{
private URL rUrl;
private BufferedImage img;
public ImgPanel(String filename) {
super();
try {
rUrl = getClass().getResource(filename);
if (rUrl != null) {
img = ImageIO.read(rUrl);
}
} catch (IOException ex) {
System.out.println("Couldn't find image file: " + filename);
}
}
@Override
protected void paintComponent(Graphics g) {
this.setSize(240, 320); //If I do not set the size of the ImgPanel manually
//it for some reason gets the dimension (10, 10) and
//all the images are shrunk to fit it. Without this
//line though, the images do not stack and are
//displayed as would be expected from flowLayout.
g.drawImage(img, 0, 0, getWidth(), getHeight(), this);
}
}
Как можно видеть выше, я прокомментировал часть, что я подозреваю, это проблема. Мой класс GUI выглядит следующим образом:
public class ClientGUI extends JFrame{
private JTextArea chatwindow;
private JList users;
private JTextField enterChat;
private JPanel draftMonitor;
private JPanel chatMonitor;
private JPanel chatLeft;
private DefaultListModel listModel;
public ClientGUI(){
super("Client");
setLayout(new BorderLayout());
chatwindow = new JTextArea();
chatwindow.setEditable(false);
chatwindow.setRows(15);
chatwindow.setWrapStyleWord(true);
DefaultCaret caret = (DefaultCaret)chatwindow.getCaret();
caret.setUpdatePolicy(DefaultCaret.ALWAYS_UPDATE);
listModel = new DefaultListModel();
users = new JList(listModel);
users.setVisibleRowCount(15);
users.setPrototypeCellValue("AAAAAAAAAAAAAAAAAAAA");
//The above line is what I used to set the width of the JList,
//it has nothing to do with the question at hand, but I know
//there must be plenty of ways to improve this rather crude
//piece of coding.
enterChat = new JTextField();
chatLeft = new JPanel();
chatLeft.setLayout(new BorderLayout());
chatLeft.add(enterChat,"South");
chatLeft.add(new JScrollPane(chatwindow),"Center");
chatMonitor = new JPanel();
chatMonitor.setLayout(new BorderLayout());
chatMonitor.add(new JScrollPane(users),"East");
chatMonitor.add(chatLeft,"Center");
draftMonitor = new JPanel();
draftMonitor.setLayout(new FlowLayout());
draftMonitor.add(new ImgPanel("exampleimage.jpg"));
draftMonitor.add(new ImgPanel("exampleimage.jpg"));
draftMonitor.add(new ImgPanel("exampleimage.jpg"));
draftMonitor.add(new ImgPanel("exampleimage.jpg"));
draftMonitor.add(new ImgPanel("exampleimage.jpg"));
draftMonitor.add(new ImgPanel("exampleimage.jpg"));
draftMonitor.add(new ImgPanel("exampleimage.jpg"));
draftMonitor.add(new ImgPanel("exampleimage.jpg"));
draftMonitor.add(new ImgPanel("exampleimage.jpg"));
getContentPane().add(chatMonitor,"South");
getContentPane().add(draftMonitor,"Center");
}
public JTextArea getChatWindow(){
return chatwindow;
}
public JTextField getEnterChat(){
return enterChat;
}
public JList getUsers(){
return users;
}
public DefaultListModel getListModel(){
return listModel;
}
}
Это производит девять Копирует из примера изображения, каждый чуть больше прав, чем другой (десять пикселей?), Но накладываются на друг друга с крайней левой один на вершине. Они не сосредоточены, они немного вправо (видимо, так).
Без подозрительной линии в классе ImgPanel она производит то, что я ожидаю, девять изображений в разнесенной строке, центрированной. Однако они намного меньше фактического размера исходного изображения.
Я благодарен за всю помощь, которую я могу получить, это кодирование графического интерфейса - это сложный бизнес!
Этот вопрос взывает к [sscce] (http://sscce.org). – trashgod
Спасибо trashgod, это первый раз, когда мне приходилось обращаться за помощью, поэтому я не был уверен, как сократить код. Имеет смысл, хотя держать его коротким и простым, я обязательно буду иметь это в виду в будущем. –