@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)
Поэтому, как Вы и другие указали, он похож, там будут временами, где индекс будет использоваться, или сканирование таблицы произойдет, но Вы не можете действительно решить что до времени выполнения.
Чтобы сделать панели во фрейме индивидуально изменяемыми, вам нужно добавить их на JSplitPane
.
Вместо того, чтобы помещать его в южную часть фрейма, поместите JSplitPane
в центр. Разделенная панель создаст впечатление, что нижняя разделенная панель находится на юге, а верхняя разделенная панель будет находиться в центре кадра.
Убедитесь, что вы установили ориентацию двух панелей с помощью setOrientation (JSplitPane.VERTICAL_SPLIT)
.
Затем вы можете изменить размер панелей, которые находятся на панели.
Думаю, вы хотели сказать 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());
}
}
Возможно, вам придется указать JFrame.setResizeable = true;
как для родительского JFrame
(тот, который имеет макет границы), так и для дочернего JFrame
.
Вы также можете использовать JPanel
на южной границе.