Строка (drawString) исчезает только при прокрутке (JAVA) - PullRequest
1 голос
/ 05 января 2012

У меня есть JFrame, содержащий JScrollPane, содержащий JPanel (только с графикой) и JTabbedPanel.На JScrollPane вот метод рисования:

public void paint(Graphics g) {
    g2d = (Graphics2D) g;
    super.paint(g2d);
    if (geneLines.size() != 0 ) {
        g2d.drawString("5'",linePadding, topMargin+4); 
        for(int i=0; i<geneLines.size();i++) {
            drawDNALine(i);
            drawLineLabels(i);
            for(int j=0; j<geneLines.get(i).size();j++) {
                Gene gene = geneLines.get(i).get(j);
                drawGene(i, gene.getMid(), initColor(gene.getFunctionnality()), gene.getFunctionnality() >= 2 ? (float)0.5:(float)1, gene);
            }
        }
        g2d.drawString("3'", 510, (geneLines.size()-1)*linePadding+topMargin+4);
    }
    setPreferredSize(new Dimension(getWidth()-20,(geneLines.size()-1)*linePadding+topMargin-GlobalVars.squareY/2+topMargin));
    revalidate();
}

А вот метод drawGene:

private void drawGene(int l, int mid, Color c, float w, Gene g) {
    int posX = Math.round(((((float)mid/(float)length)-l)*400+100-GlobalVars.squareX/2));
    int posY = l*linePadding+topMargin-GlobalVars.squareY/2;
    g2d.setColor(c);
    g2d.fillRect(posX,posY,(int) (GlobalVars.squareX*w),GlobalVars.squareY);
    g2d.setColor(Color.black);
    g2d.drawRect(posX,posY,(int) (GlobalVars.squareX*w),GlobalVars.squareY);
    AffineTransform atBefore = g2d.getTransform(); 
    Rectangle2D r = g2d.getFontMetrics().getStringBounds(g.getName(), g2d);
    AffineTransform trans = AffineTransform.getTranslateInstance(posX+5, posY-40);
    trans.concatenate(AffineTransform.getRotateInstance(-Math.PI/2));
    trans.concatenate(AffineTransform.getTranslateInstance(-r.getCenterX(), -r.getCenterY()));
    g2d.setTransform(trans);
    g2d.drawString(g.getName(), 0, 0);
    g2d.setTransform(atBefore);
}

Итак, вот моя цель и моя проблема.Я должен сделать картину, показывающую распределение генов по линиям.Каждый ген представляет собой квадрат (или прямоугольник), и я должен написать название гена вертикально над квадратом / прямоугольником.Я также записываю некоторую информацию, такую ​​как длина линии и т. Д. Таким образом, когда я изменяю размер рамки, все в порядке (хорошо перекрашивается), то же самое, если я уменьшаю рамку.Но, если количество строк слишком велико, появляется полоса прокрутки (поэтому я использую JScrollPane).И когда я перемещаю эту полосу прокрутки, весь вертикальный текст исчезает.Я не понимаю почему, потому что рисование текста в том же методе, что и рисование прямоугольника (и они хорошо перекрашиваются при прокрутке).

Я понятия не имею, откуда это исходит ... ЯЯ пытался перерисовать вручную, но у меня ничего не получилось.

Я использую Eclipse в Windows, и я готов, если вам понадобится дополнительная информация, конечно.Большое спасибо за любую помощь.

1 Ответ

2 голосов
/ 05 января 2012

Вы должны использовать простую JScrollPane с JPanel для рисования и изменения размера. Если вы дадите JPanel рамку и другой цвет фона, вы увидите, все ли ведет себя как нужно.


Другой ответ

Живопись должна быть быстрой, а не вызывать setPreferredSize и revalidate. На данный момент вы можете сделать:

if (...size changes) {
    SwingUtilities.invokeLater(new Runnable()) {
        @Overriden
        public void run() {
            ...setPreferredSize and revalidate
        }
    }
}

Тогда это?

final double NINETY_DEGREES = Math.PI/2;
Rectangle2D r = g2d.getFontMetrics().getStringBounds(g.getName(), g2d);
g2d.translate(posX+5, posY-40);
g2d.rotate(-NINETY_DEGREES);
g2d.translate(-r.getCenterX(), -r.getCenterY());
g2d.drawString(g.getName(), 0, 0);
g2d.translate(r.getCenterX(), r.getCenterY());
g2d.rotate(NINETY_DEGREES);
g2d.translate(-(posX+5), -(posY-40));

Нет никакой разницы, но, возможно, картина занимает много времени, и тогда это может помочь.


В крайнем случае

Создайте JPanel с BoxLayout в вертикальном направлении. Добавьте для каждой линии JPanel, который выполняет рисование только для этой линии. (Или JList)

...