Создание JPanel, вручную изменяемого размера

@Mike: Спасибо за подробный анализ. Существуют определенно некоторые интересные замечания, которые Вы делаете там. Пример, который я отправил, несколько тривиален, но основание вопроса прибыло из использования NHibernate.

С NHibernate, можно записать пункт как это:

int[] employeeIds = new int[]{1, 5, 23463, 32523};
NHibernateSession.CreateCriteria(typeof(Employee))
.Add(Restrictions.InG("EmployeeId",employeeIds))

NHibernate тогда генерирует запрос, который похож

select * from employee where employeeid in (1, 5, 23463, 32523)

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

12
задан jjnguy 13 July 2009 в 20:57
поделиться

3 ответа

Чтобы сделать панели во фрейме индивидуально изменяемыми, вам нужно добавить их на JSplitPane .

Вместо того, чтобы помещать его в южную часть фрейма, поместите JSplitPane в центр. Разделенная панель создаст впечатление, что нижняя разделенная панель находится на юге, а верхняя разделенная панель будет находиться в центре кадра.

Убедитесь, что вы установили ориентацию двух панелей с помощью setOrientation (JSplitPane.VERTICAL_SPLIT) .

Затем вы можете изменить размер панелей, которые находятся на панели.

24
ответ дан 2 December 2019 в 04:43
поделиться

Думаю, вы хотели сказать JPanel. Вы можете добавить пользовательский mouseListener и обрабатывать щелчки мышью, перетаскивание и отпускание мыши, а затем программно изменять размер панели.

Это продемонстрирует это. Обратите внимание, что jframe НЕ изменяет размер автоматически с помощью JPanel. Чтобы сделать эффект более заметным, я покрасил панель в красный цвет и добавил скошенную границу:

import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.Point;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.awt.event.MouseMotionAdapter;

import javax.swing.BorderFactory;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.border.BevelBorder;

@SuppressWarnings("serial")
public class ResizablePanel extends JPanel {

    private boolean drag = false;
    private Point dragLocation  = new Point();

    public  ResizablePanel() {
        setBorder(BorderFactory.createBevelBorder(BevelBorder.RAISED));
        setPreferredSize(new Dimension(500, 500));
        final JFrame f = new JFrame("Test");
        addMouseListener(new MouseAdapter() {
            @Override
            public void mousePressed(MouseEvent e) {
                drag = true;
                dragLocation = e.getPoint();
            }

            @Override
            public void mouseReleased(MouseEvent e) {
                drag = false;
            }
        });
        addMouseMotionListener(new MouseMotionAdapter() {
            @Override
            public void mouseDragged(MouseEvent e) {
                if (drag) {
                    if (dragLocation.getX()> getWidth()-10 && dragLocation.getY()>getHeight()-10) {
                        System.err.println("in");
                        setSize((int)(getWidth()+(e.getPoint().getX()-dragLocation.getX())),
                                (int)(getHeight()+(e.getPoint().getY()-dragLocation.getY())));
                        dragLocation = e.getPoint();
                    }
                }
            }
        });
        f.getContentPane().setLayout(new BorderLayout());
        f.getContentPane().add(this,BorderLayout.CENTER);
        f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        f.pack();
        f.setVisible(true);
    }

    public static void main(String[] args) {
        new ResizablePanel();
    }

    public void paintComponent(Graphics g) {
        g.setColor(Color.red);
        g.fillRect(0, 0, getWidth(), getHeight());
    }

}
12
ответ дан 2 December 2019 в 04:43
поделиться

Возможно, вам придется указать JFrame.setResizeable = true; как для родительского JFrame (тот, который имеет макет границы), так и для дочернего JFrame .

Вы также можете использовать JPanel на южной границе.

-4
ответ дан 2 December 2019 в 04:43
поделиться
Другие вопросы по тегам:

Похожие вопросы: