WedX - журнал о программировании и компьютерных науках

Индивидуальный графический интерфейс ImageJ2

Я пытаюсь поместить окно imageJ в панель рабочего стола, которую я создал, но у меня возникают проблемы с этим. Как вы используете исходный код imageJ2 для создания настраиваемого графического интерфейса, в котором окно imageJ находится внутри панели рабочего стола? Это для imageJ2: https://github.com/imagej/imagej

Ниже приведен код, в котором я попытался создать настраиваемый графический интерфейс, в котором отображается окно изображения. Но оно не похоже на оригинальное окно, созданное imageJ, потому что оно не содержит никакой информации об изображении, и вы не можете его выбрать. Я хочу, чтобы окно imageJ находилось внутри панели рабочего стола, но я не могу этого сделать.

public class CustomGui extends ImageWindow implements InternalFrameListener, ActionListener {

    MyInternalFrame frame;
    int openFrameCount =0;
    ImagePlus img;
    boolean called = false;
    JMenuItem save;
    String title;
    final String SHOW ="show";

    public CustomGui(ImagePlus imp, String title, JDesktopPane desktop, final JMenuItem save) {
        super(imp);
        // TODO Auto-generated constructor stub
        setCall();
        img = imp;
        save.setEnabled(true);
        //this.title = title;
        FileInfo file = imp.getFileInfo();
        this.save = save;
        frame = new MyInternalFrame(title, img, save);
        JTextField text = new JTextField(img.getHeight());
        text.setVisible(true);
        text.setEditable(false);;
        frame.add(text);

        frame.add(new JLabel(new ImageIcon(imp.getImage())));

        frame.setVisible(true);
        desktop.add(frame);
        try {
            frame.setSelected(true);
        } catch (java.beans.PropertyVetoException e) {

        }
        frame.addInternalFrameListener(this);
        // options(name, desktop);
    }

    public void actionPerformed(ActionEvent e) {
        if (e.getActionCommand().equals(SHOW)) {
            save.setEnabled(true);
            frame.addInternalFrameListener(this);
        }

        System.out.println("beingg called");
    }

    public void setCall() {
        called = true;
    }

    public void setCallF() {
        called = false;
    }

    public boolean getCall() {
        return called;
    }

    private class MyInternalFrame extends JInternalFrame {

        static final int xPosition = 30, yPosition = 30;
        public MyInternalFrame(String title, ImagePlus img, JMenuItem save) {
            super(title, true,true, true, true);
            setSize(img.getHeight(), img.getWidth());

            // Set the window's location.
            setLocation(xPosition * openFrameCount, yPosition * openFrameCount);
            save.setEnabled(true);
        }
    }

    @Override
    public void internalFrameActivated(InternalFrameEvent arg0) {
        // TODO Auto-generated method stub
        setCall();
        save.setEnabled(true);
        System.out.println("resized");
    }

    @Override
    public void internalFrameClosed(InternalFrameEvent arg0) {
        // TODO Auto-generated method stub
        setCall();
        save.setEnabled(false);
        System.out.println("resized");
    }

    @Override
    public void internalFrameClosing(InternalFrameEvent arg0) {
        // TODO Auto-generated method stub
        setCall();
        save.setEnabled(false);
        System.out.println("resized");
    }

    @Override
    public void internalFrameDeactivated(InternalFrameEvent arg0) {
        // TODO Auto-generated method stub
        setCall();
        save.setEnabled(false);
        System.out.println("resized");
    }

    @Override
    public void internalFrameDeiconified(InternalFrameEvent arg0) {
        // TODO Auto-generated method stub
        setCall();
        save.setEnabled(true);
        System.out.println("resized");
    }

    @Override
    public void internalFrameIconified(InternalFrameEvent arg0) {
        // TODO Auto-generated method stub
        setCall();
        save.setEnabled(false);
        System.out.println("resized");
    }

    @Override
    public void internalFrameOpened(InternalFrameEvent arg0) {
        // TODO Auto-generated method stub
        //setCall();
        save.setEnabled(true);
        System.out.println("opened");
    }

}

  • Можете ли вы рассказать нам, что вы пытались сделать? 10.05.2014
  • Я добавил код, надеюсь, теперь он имеет смысл. 12.05.2014
  • Обратите внимание, что в опубликованном вами коде используются структуры данных ImageJ 1.x, а не ImageJ2. Если вы хотите изучить ImageJ2, посетите github.com/imagej/imagej-tutorials. 15.05.2014

Ответы:


1

Внезапно в StackOverflow появилось множество вопросов по этой теме [1, 2, 3, 4, 5, 6, 7]. Они имеют мало общего с ImageJ конкретно. Это всего лишь вопросы об адаптации приложения, в основном основанного на SDI (java.awt.Frame), к приложению, основанному на MDI (javax.swing.JInternalFrame).

Сделать это — огромное усилие, особенно для начинающего программиста. Вам потребуется переписать значительную часть кодовой базы ImageJ 1.x, поскольку она никогда не предназначалась для работы в качестве чего-то другого, кроме единого пользовательского интерфейса на основе SDI AWT.

Вы должны быть хорошо знакомы с Java Swing, особенно с MDI и JInternalFrame; см. учебник по Java по JInternalFrame, чтобы начать работу.

Но одного этого будет недостаточно. Если только вы не потратите сотни или даже тысячи часов на чрезвычайно тщательный дизайн и не используете передовые методы, такие как манипулирование байт-кодом Java, вы получите что-то, что не будет обратно совместимо с ImageJ 1.x и, следовательно, не будет работать с большинством его плагинов. И что бы вы ни делали, некоторые плагины не будут вести себя так, как вы хотите, потому что они напрямую полагаются на тот факт, что структуры данных ImageJ1 по своей природе являются компонентами SDI AWT.

Итак, прежде чем броситься на этот трек, я хочу спросить: чего вы действительно хотите достичь? Почему вы это делаете? Какова конечная цель? Как это поможет пользователям?

Если вы серьезно хотите по какой-то причине перепроектировать ImageJ как MDI-приложение, я бы посоветовал вам проверить ImageJ2. Одной из его основных целей является правильное разделение задач, т. е. изоляция логики модели данных от логики отображения, чтобы сделать возможными такие вещи, как пользовательские интерфейсы MDI. Он находится в разработке уже более четырех лет, и у нас есть доказательство концепции пользовательского интерфейса MDI Swing. Но он пока не очень функционален, а сама структура пользовательского интерфейса все еще нуждается в дополнительных итерациях — эти компоненты все еще находятся в стадии бета-тестирования и будут существовать еще как минимум год. Вы можете принять участие, и мы будем рады ответить на конкретные технические вопросы по этому поводу, но это будет очень крутой кривой обучения для тех, кто еще не знаком с Java Swing близко.

Гораздо проще найти альтернативный способ достижения ваших целей здесь. Я призываю вас писать в список рассылки ImageJ, подробно описывая свои потребности. Затем мы можем предложить несколько предложений о дальнейших действиях.

Примечание. Этот ответ был адаптирован из ответа Я написал в список рассылки ImageJ.

15.05.2014
Новые материалы

Объяснение документов 02: BERT
BERT представил двухступенчатую структуру обучения: предварительное обучение и тонкая настройка. Во время предварительного обучения модель обучается на неразмеченных данных с помощью..

Как проанализировать работу вашего классификатора?
Не всегда просто знать, какие показатели использовать С развитием глубокого обучения все больше и больше людей учатся обучать свой первый классификатор. Но как только вы закончите..

Работа с цепями Маркова, часть 4 (Машинное обучение)
Нелинейные цепи Маркова с агрегатором и их приложения (arXiv) Автор : Бар Лайт Аннотация: Изучаются свойства подкласса случайных процессов, называемых дискретными нелинейными цепями Маркова..

Crazy Laravel Livewire упростил мне создание электронной коммерции (панель администратора и API) [Часть 3]
Как вы сегодня, ребята? В этой части мы создадим CRUD для данных о продукте. Думаю, в этой части я не буду слишком много делиться теорией, но чаще буду делиться своим кодом. Потому что..

Использование машинного обучения и Python для классификации 1000 сезонов новичков MLB Hitter
Чему может научиться машина, глядя на сезоны новичков 1000 игроков MLB? Это то, что исследует это приложение. В этом процессе мы будем использовать неконтролируемое обучение, чтобы..

Учебные заметки: создание моего первого пакета Node.js
Это мои обучающие заметки, когда я научился создавать свой самый первый пакет Node.js, распространяемый через npm. Оглавление Глоссарий I. Новый пакет 1.1 советы по инициализации..

Забудьте о Matplotlib: улучшите визуализацию данных с помощью умопомрачительных функций Seaborn!
Примечание. Эта запись в блоге предполагает базовое знакомство с Python и концепциями анализа данных. Привет, энтузиасты данных! Добро пожаловать в мой блог, где я расскажу о невероятных..


Для любых предложений по сайту: wedx@cp9.ru