Модераторы: LSD, AntonSaburov
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> JFrame, Image, repaint 
:(
    Опции темы
DissDoc
Дата 25.1.2007, 14:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 463
Регистрация: 13.7.2006

Репутация: нет
Всего: нет



Во-первых, вывод Image на фрейм использую пример из FAQ (через панель).
Во-вторых, расположил  я еще таблицу. На нажатие на ячейку таблицы (мышкой) я хочу загрузить соответсвующую картинку на панель. Но когда делаю 
MyClassImagePanel.[b]setImageFile(new File("C:\1.jpg"));
не перерисовывается панель с другой картинкой, остается картинка. которая была загружена при запуске программы.
Что мне делать? Клик на таблице работает нормально (проверял через System.out.println()).
PM MAIL WWW   Вверх
powerOn
Дата 25.1.2007, 15:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


software saboteur
****


Профиль
Группа: Участник
Сообщений: 4367
Регистрация: 7.10.2005

Репутация: 31
Всего: 159



Цитата(DissDoc @  25.1.2007,  14:48 Найти цитируемый пост)
не перерисовывается панель с другой картинкой, остается картинка. которая была загружена при запуске программы.
Что мне делать? Клик на таблице работает нормально (проверял через System.out.println()). 


Комментарии почитай к статье. Я исправлял ошибки.


--------------------
user posted image нет времени думать - нужно писать КОД!

PM MAIL   Вверх
DissDoc
Дата 25.1.2007, 15:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 463
Регистрация: 13.7.2006

Репутация: нет
Всего: нет



Хоть узнал, что оказывается есть и комменты к статьям. Заработало, но не совсем!
Чтобы картинка отобразилась, нужно панель как бы "передернуть". Вооооотт, а как обойтись без этого? Я везде попробовал натыкать
Код

repaint();
validate();

Но это не помогло...
PM MAIL WWW   Вверх
powerOn
Дата 25.1.2007, 15:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


software saboteur
****


Профиль
Группа: Участник
Сообщений: 4367
Регистрация: 7.10.2005

Репутация: 31
Всего: 159



validate() у кого делаешь? Нужно делать у контейнера на котором PicturePanel весит. Выкладывай код, который можно запустить, я поправлю.


--------------------
user posted image нет времени думать - нужно писать КОД!

PM MAIL   Вверх
DissDoc
Дата 25.1.2007, 15:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 463
Регистрация: 13.7.2006

Репутация: нет
Всего: нет



eArhive.java
Код

import javax.swing.*;
import java.awt.event.*;
import java.awt.*;
import java.io.*;
import java.beans.*;

public class eArhive extends JFrame
{
    private eFileShow  __eFileShow;
    private eFilesView __eFilesView;
    private eXMLViewer __eXMLViewer;

    public eArhive() {
        super("eArhive [ver. 0.0.2.5]");
        this.setFont(new Font("Verdana", Font.PLAIN, 11));

        // Установим меню
        eMenuBar __eMenuBar = new eMenuBar(this);
        setJMenuBar(__eMenuBar);

        // Разделим окно на части ----------------------------------------------

        // Поле отображения (рендеринга) файла
        __eFileShow = new eFileShow();
        __eFileShow.setImageFile(new File("D:\\1.jpg"));
        __eFileShow.setMinimumSize(new Dimension(200, 500));
        // Поле отображения директорий файлов
        __eFilesView = new eFilesView(this);
        __eFilesView.setMinimumSize(new Dimension(200, 300));
        // Поле отображения XML файла
        __eXMLViewer = new eXMLViewer();
        __eXMLViewer.setMinimumSize(new Dimension(200, 300));

        // Разделения экрана программы
        JSplitPane eLeftPart = new JSplitPane(JSplitPane.VERTICAL_SPLIT, false,
                                              __eFilesView, __eXMLViewer);
        JSplitPane eRightPart = new JSplitPane(JSplitPane.VERTICAL_SPLIT, false,
                                               __eFileShow, new Button("444"));
        JSplitPane j2Parts = new JSplitPane(JSplitPane.HORIZONTAL_SPLIT, false,
                                            eLeftPart, eRightPart);
        getContentPane().add(j2Parts);

        // Получаем размер экранa
        Dimension display = Toolkit.getDefaultToolkit().getScreenSize();
        setBounds( ( (int) display.getWidth() - 1024) / 2, // Координата Х
                  ( (int) display.getHeight() - 768) / 2, // Координата У
                  1024, // ширина окна
                  768); // высота окна

        // Отобразим фрейм
        show();
    }

    public static void main(String args[]) {
        try
        {
            UIManager.setLookAndFeel("com.sun.java.swing.plaf.windows.WindowsLookAndFeel");
        }
        catch (Exception e)
        {

        }
        eArhive app = new eArhive();
        app.addWindowListener(
            new WindowAdapter() {
            public void WindowClosing(WindowEvent e) {
                System.exit(0);
            }
        });
    }

    public eFilesView getClassFilesView()
    {
        return __eFilesView;
    }

    public eFileShow getClassFileShow()
    {
        return __eFileShow;
    }
}


eFilesView.java
Код

import java.awt.*;
import java.io.*;
import java.util.*;
import javax.swing.*;
import javax.swing.table.*;
import javax.swing.border.*;
import java.awt.event.*;

public class eFilesView extends JPanel
{
    private JScrollPane jScrollTable;
    private JTable table;
    private DefaultTableModel model;
    private String directory;
    private eArhive __eArhive;

    public eFilesView(eArhive eArh)
    {
        // Получим класс eArhive
        __eArhive = eArh;

        // Создадим таблицу
        model = new eDefaultTableModel();
        table = new JTable(model);

        // Укажем размер первой колонки
        table.getColumnModel().getColumn(0).setPreferredWidth(10);

        // Добавим слушателя
        table.addMouseListener(new eFilesView_this_mouseAdapter(this));
        //table.setDefaultRenderer(Object.class, new ColorTableCellRenderer());
        jScrollTable = new JScrollPane(table);
        jScrollTable.setBounds(new Rectangle(0, 0, 200, 300));

        this.setLayout(null);
        this.add(jScrollTable, null);
    }

    public void eTableAddRow(String id_file)
    {
        String[] full_string = {"0", id_file};
        model.addRow(full_string);
    }
    private void jbInit() throws Exception {

    }

    void this_mouseReleased(MouseEvent e)
    {
        String created_dir = directory+"\\"+table.getValueAt(table.getSelectedRow(), 1);
        __eArhive.getClassFileShow().setImageFile(new File(created_dir));
        __eArhive.getClassFileShow().UpdatePanel();
    }

    public void setDirectoryOfFiles(String dir)
    {
        directory = dir;
    }

    public void removeAllRows()
    {
        for (int i = table.getRowCount() - 1; i >= 0; i--)
            model.removeRow(i);
    }
}

class ColorTableCellRenderer extends DefaultTableCellRenderer
{
    public Component getTableCellRendererComponent
           (JTable table, Object value, boolean isSelected,
           boolean hasFocus, int row, int column)
      {
          JLabel comp = (JLabel) super.getTableCellRendererComponent(table, value, isSelected, hasFocus, row, column);
          comp.setBackground(Color.red);
          return comp;
      }

}

class eFilesView_this_mouseAdapter extends java.awt.event.MouseAdapter {
    eFilesView adaptee;

    eFilesView_this_mouseAdapter(eFilesView adaptee)
    {
        this.adaptee = adaptee;
    }

    public void mouseReleased(MouseEvent e)
    {
        adaptee.this_mouseReleased(e);
    }
}


eFilesShow.java
Код

import java.awt.*;
import java.awt.image.*;
import java.awt.event.*;
import javax.swing.*;
import javax.imageio.*;
import java.io.*;
import java.util.*;

public class eFileShow extends JPanel
{
    // Храним два изображения
    // @buf_image - оригинал
    // @image     - рисуемое
    private BufferedImage buf_image = null;
    private Image image = null;

    public eFileShow()
    {
        renderComponents();
    }

    private void renderComponents()
    {
        setLayout(null);
        addComponentListener(
            new ComponentAdapter()
            {
                public void componentResized(ComponentEvent evt)
                {
                    getFormSize(evt);
                }
            });
    }

    // Реакция на изменение размеров панели (изменяем размеры img)
    private void getFormSize(ComponentEvent evt)
    {
        int w = this.getWidth();
        int h = this.getHeight();

        if ((buf_image != null) && (w > 0 && h > 0))
        {
            image = buf_image.getScaledInstance(w, h, Image.SCALE_DEFAULT);
            this.repaint();
        }
    }

    // Прорисовываем изображение
    public void paint(Graphics g)
    {
        if (image != null)
            g.drawImage(image, 0, 0, null);

        super.paintChildren(g);
        super.paintBorder(g);
    }

    // Настройка картинки (загрузка, запись и т.п.)
    public BufferedImage getImage()
    {
        return buf_image;
    }

    public void setImage(BufferedImage bimg)
    {
        this.buf_image = bimg;
        int w = this.getWidth();
        int h = this.getHeight();

        if ((buf_image != null) && (w > 0) && (h > 0))
        {
            this.image = buf_image.getScaledInstance(w, h, image.SCALE_DEFAULT);
            getParent().repaint();
        }
    }

    public void setImageFile(File image_file)
    {
        try
        {
            if (image_file == null)
            {
                buf_image = null;
            }
            BufferedImage bi = ImageIO.read(image_file);
            buf_image = bi;
        }
        catch(IOException exc)
        {
            System.err.println("File not found!");
            exc.printStackTrace();
        }

        repaint();
    }

    public void UpdatePanel()
    {
        getParent().repaint();
        getParent().validate();
    }
}


Советую. Отстальные элементы в eArhive переделать на кнопки )))) Чтобы весь код не выкладывать
И в eFilesView - DefaultTableModel по умолчанию вставить (ну думаю разберешься) На табличке нуно кликать и получать картинки )) Прорисовка в eFileShow.java
PM MAIL WWW   Вверх
powerOn
Дата 25.1.2007, 16:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


software saboteur
****


Профиль
Группа: Участник
Сообщений: 4367
Регистрация: 7.10.2005

Репутация: 31
Всего: 159



Гм... Когда просят выложить код который можно запустить подразумевают что его можно скопировать и запустить.  smile  Не иначе.

Вот код который можно запустить, при этом PicturePanel работает в таком виде в котором лежит в FAQ (с учетом исправлений конечно):

Код

import java.awt.Graphics;
import java.awt.Image;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;
import javax.imageio.ImageIO;
import javax.swing.JFileChooser;

public class NewJFrame extends javax.swing.JFrame
{
    public NewJFrame()
    {
        jPanel1 = new javax.swing.JPanel();
        jButton1 = new javax.swing.JButton();
        picturePanel1 = new PicturePanel();
        setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);
        jButton1.setText("Open");
        jButton1.addActionListener(new java.awt.event.ActionListener()
        {
            public void actionPerformed(java.awt.event.ActionEvent evt)
            {
                jButton1ActionPerformed(evt);
            }
        });

        jPanel1.add(jButton1);
        getContentPane().add(jPanel1, java.awt.BorderLayout.PAGE_END);
        getContentPane().add(picturePanel1, java.awt.BorderLayout.CENTER);
        pack();
    }

    private void jButton1ActionPerformed(java.awt.event.ActionEvent evt)                                         
    {                                             
        // TODO add your handling code here:
        JFileChooser jfc = new JFileChooser();
        if (jfc.showOpenDialog(this) != jfc.CANCEL_OPTION)
        {
            try
            {
                BufferedImage bi = ImageIO.read(jfc.getSelectedFile());
                picturePanel1.setImage(bi);
            } catch (IOException ex)
            {
                ex.printStackTrace();
            }
        }
    }                                        

    public static void main(String args[])
    {
        java.awt.EventQueue.invokeLater(new Runnable()
        {
            public void run()
            {
                new NewJFrame().setVisible(true);
            }
        });
    }
                   
    private javax.swing.JButton jButton1;
    private javax.swing.JPanel jPanel1;
    private PicturePanel picturePanel1;

}

class PicturePanel extends javax.swing.JPanel
{
    // Храним 2 изображения: оригинальное и текущее.
    // Оригинальное используется для получения текущего в зависимости от размеров панели.
    // Текущее непосредственно прорисовывается на панели.
    private BufferedImage originalImage = null;
    private Image image = null;
    public PicturePanel()
    {
        initComponents();
    }
    
    private void initComponents()
    {
        setLayout(null);
        addComponentListener(new java.awt.event.ComponentAdapter()
        {
            public void componentResized(java.awt.event.ComponentEvent evt)
            {
                formComponentResized(evt);
            }
        });
    }
    
    // Реакция на изменение размеров панели - изменение размера изображения.
    private void formComponentResized(java.awt.event.ComponentEvent evt)
    {
        int w = this.getWidth();
        int h = this.getHeight();
        if ((originalImage != null) && (w > 0) && (h > 0))
        {
            image = originalImage.getScaledInstance(w, h, Image.SCALE_DEFAULT);
            this.repaint();
        }
    }
    // Берем прорисовку в свои руки.
    public void paint(Graphics g)
    {
        // Рисуем картинку
        if (image != null)
        {
            g.drawImage(image, 0, 0, null);
        }
        
        // Рисуем подкомпоненты.
        super.paintChildren(g);
        // Рисуем рамку
        super.paintBorder(g);
    }
    
    // Методы для настройки картинки.
    public BufferedImage getImage()
    {
        return originalImage;
    }
    
    public void setImage(BufferedImage image)
    {
        this.originalImage = image;
        int w = this.getWidth();
        int h = this.getHeight();
        if ((originalImage != null) && (w > 0) && (h > 0))
        {
            this.image = originalImage.getScaledInstance(w, h, image.SCALE_DEFAULT);
            getParent().repaint();
        }
    }
    
    public void setImageFile(File imageFile)
    {
        try
        {
            if (imageFile == null)
            {
                originalImage = null;
            }
            BufferedImage bi = ImageIO.read(imageFile);
            originalImage = bi;
        }
        catch (IOException ex)
        {
            System.err.println("Неудалось загрузить картинку!");
            ex.printStackTrace();
        }
        repaint();
    }
}


И передергивать ничего не нужно.


--------------------
user posted image нет времени думать - нужно писать КОД!

PM MAIL   Вверх
DissDoc
Дата 25.1.2007, 16:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 463
Регистрация: 13.7.2006

Репутация: нет
Всего: нет



Передергивает по сути getFormSize(evt) - вот я ее в паблик загнал и передергивать стал )
Все естессно заработало )

Это сообщение отредактировал(а) DissDoc - 25.1.2007, 16:43
PM MAIL WWW   Вверх
powerOn
Дата 25.1.2007, 17:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


software saboteur
****


Профиль
Группа: Участник
Сообщений: 4367
Регистрация: 7.10.2005

Репутация: 31
Всего: 159



Еще можно поправить метод:

Код

public void setImageFile(File imageFile)
    {
        try
        {
            if (imageFile == null)
            {
                originalImage = null;
            }
            BufferedImage bi = ImageIO.read(imageFile);
            setImage(bi);
        }
        catch (IOException ex)
        {
            System.err.println("Неудалось загрузить картинку!");
            ex.printStackTrace();
        }
     }



--------------------
user posted image нет времени думать - нужно писать КОД!

PM MAIL   Вверх
DissDoc
Дата 27.1.2007, 12:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 463
Регистрация: 13.7.2006

Репутация: нет
Всего: нет



powerOn, угу. Так будет более грамотно, спасибо. 
Хотя по сути ничего не изменилось. (Я так понимаю просто присваивать картинки напрямую "опасно")
PM MAIL WWW   Вверх
DissDoc
Дата 29.1.2007, 10:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 463
Регистрация: 13.7.2006

Репутация: нет
Всего: нет



А вот такой вот вопрос... Можно ли наследовать от JScrollPane а не от Panel PicturePanel? Я например наследую - но при уменьшении фрема ничего не происходит.. Т.е. не появляются ползунки....  smile 
PM MAIL WWW   Вверх
powerOn
Дата 30.1.2007, 21:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


software saboteur
****


Профиль
Группа: Участник
Сообщений: 4367
Регистрация: 7.10.2005

Репутация: 31
Всего: 159



Цитата(DissDoc @  29.1.2007,  10:53 Найти цитируемый пост)
Я например наследую - но при уменьшении фрема ничего не происходит.. Т.е. не появляются ползунки.... 

PicturePanel тут нипричем. Тут просто нужно свойства компонентов грамотно выставить.


--------------------
user posted image нет времени думать - нужно писать КОД!

PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Java"
LSD   AntonSaburov
powerOn   jk1
  • Прежде, чем задать вопрос, прочтите это!
  • Книги по Java собираются здесь.
  • Документация и ресурсы по Java находятся здесь.
  • Используйте теги [code=java][/code] для подсветки кода. Используйтe чекбокс "транслит", если у Вас нет русских шрифтов.
  • Помечайте свой вопрос как решённый, если на него получен ответ. Ссылка "Пометить как решённый" находится над первым постом.
  • Действия модераторов можно обсудить здесь.
  • FAQ раздела лежит здесь.

Если Вам помогли, и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, LSD, AntonSaburov, powerOn, jk1.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Java: GUI и Java FX приложения | Следующая тема »


 




[ Время генерации скрипта: 0.0563 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.