2011-06-09 6 views
0

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

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

+1

Этот вопрос взывает к [sscce] (http://sscce.org). – trashgod

+0

Спасибо trashgod, это первый раз, когда мне приходилось обращаться за помощью, поэтому я не был уверен, как сократить код. Имеет смысл, хотя держать его коротким и простым, я обязательно буду иметь это в виду в будущем. –

ответ

1

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

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

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

+0

Спасибо за комментарий, но я думаю, что я начну с предложения Devon_C_Miller и пойду с чем-то простым, так как я новичок. –

2

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

+0

Благодарим вас за предложение, я работаю с ImageIcons и, похоже, сейчас работает. Очень признателен. –

Смежные вопросы