Изображения, накладывающиеся друг на друга, несмотря на расплавление? - PullRequest
0 голосов
/ 09 июня 2011

Сначала я признаю, что я очень новичок в кодировании графических интерфейсов с помощью 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 получается то, что я ожидаю, девять изображений в разнесенном ряду с центром.Однако они намного меньше, чем фактический размер исходного изображения.

Я благодарен за всю помощь, которую я могу получить, это кодирование графического интерфейса пользователя - сложное дело!

Ответы [ 2 ]

2 голосов
/ 10 июня 2011

Лучший способ обработки изображений - использовать JLabel и createImageIcon .Там уже много кода для обработки изображений, так что не изобретайте колесо.

1 голос
/ 10 июня 2011

Здесь есть что комментировать, но JPanel по умолчанию имеет небольшой размер.Частично это определяется используемым вами LayoutManager.В этом случае, не устанавливая значение по умолчанию или предпочитаемый размер, он сам выбирает 10,10 пикселей.Вам нужно указать размер, он не будет сам определять это на основе размеров изображений.

Возможно, вы захотите взглянуть на проект Java SwingX, в котором есть JXImagePanel, который по сути делает то же самое, что и вы ImgPanel.

Я знаю, что это отвечает только на часть проблемы, но, как прокомментировал trashgod,упрощение этой задачи до более мелкой проблемы с кодом поможет решить каждую проблему отдельно

...