Сначала я признаю, что я очень новичок в кодировании графических интерфейсов с помощью Swing, поэтому, пожалуйста, имейте это в виду.
Я создал графический интерфейс, состоящий из JPanel сверху, который должен отображать изображения, иодин из нижних содержит несколько компонентов графического интерфейса, составляющих чат.Я позаботился о чате (хотя вы можете указать на ошибки и улучшения).Сейчас я обеспокоен обработкой изображений в верхней JPanel.
Насколько я понимаю, при работе с изображениями целесообразно расширить JPanel в новый класс, который рисует изображения в GUI.Я написал такой класс, основываясь на других ответах, которые нашел на этом сайте:
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);
}
}
Как видно выше, я прокомментировал ту часть, которая, как я подозреваю, является проблемой.Мой класс графического интерфейса выглядит следующим образом:
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 получается то, что я ожидаю, девять изображений в разнесенном ряду с центром.Однако они намного меньше, чем фактический размер исходного изображения.
Я благодарен за всю помощь, которую я могу получить, это кодирование графического интерфейса пользователя - сложное дело!