2017-01-18 5 views
0

Есть ли способ показать только Java, чтобы показывать большие изображения в JScrollPane? Я не хочу изобретать колесо, и я уже изо всех сил пытаюсь показать изображения 32768x400 с использованием ImageIcon в трюке JLabel, потому что, похоже, существуют ограничения в отношении ImageIcon, зависящих от платформы. Ubuntu 16.10 не будет показывать ImageIcon размером 32768x400, хотя он показывает более мелкие. Win10 показывает их все .... и нет даже каких-либо ошибок любого рода, что ужасно, потому что я просто потратил время на поиск проблемы.Простой способ предоставления прокручиваемого изображения (формы волны) в Java без использования ImageIcon?

Итак, есть ли простое решение для этого, которое не требует от меня изобретать велосипед?

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

+0

Вы пробовали создать 'JPanel' и переопределение это' 'paintComponent' и методы getPreferredSize' нарисовать изображение самостоятельно? Второй [пример] (http://stackoverflow.com/questions/22162398/how-to-set-a-background-picture-in-jpanel/22162430#22162430) демонстрирует основную концепцию. Возможно, это не сработает, но стоит попытаться выяснить, есть ли проблема с 'JLabel' или Ununtu – MadProgrammer

+0

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

+0

* «В частности, я хочу отображать осциллограммы» * - Вы имеете в виду что-то вроде [this] (http://stackoverflow.com/questions/27517265/graphing-wav-file-in-java/27517678#27517678) или [ это] (http://stackoverflow.com/questions/12066698/gui-freezes-when-drawing-wave-from-animation-on-jpanel-though-i-used-swing-timer/12066748#12066748)? Вам все равно нужно создать какой-то образ, и это может быть ограничением Ubuntu – MadProgrammer

ответ

1

Я считаю, что это показывает, как делать то, что вы хотите. Обратите внимание, что компонент Graph имеет ширину 65535. Это может быть дополнительно оптимизировано путем рисования видимой части графика при прокрутке, но это довольно быстро, как есть.

import java.awt.*; 
import javax.swing.*; 
import java.util.function.Function; 

class Graph extends JComponent { 
    private Function<Double, Double> fun; 

    public Graph(Function<Double, Double> fun) { 
    this.fun = fun; 
    setPreferredSize(new Dimension(65535, 300)); 
    } 

    public void paintComponent(Graphics g) { 
    // clear background 
    g.setColor(Color.white); 
    Rectangle bounds = getBounds(); 
    int w = bounds.width; 
    int h = bounds.height; 
    g.fillRect(bounds.x, bounds.y, w, h); 
    // draw the graph 
    int prevx = 0; 
    int prevy = fun.apply((double)prevx).intValue(); 
    g.setColor(Color.black); 
    for (int i=1; i<w; i++) { 
     int y = fun.apply((double)i).intValue(); 
     g.drawLine(prevx, prevy, i, y); 
     prevx = i; 
     prevy = y; 
    } 
    } 
} 

public class Wf { 
    public static void main(String[] args) { 
    JFrame f = new JFrame(); 
    // we're going to draw A sine wave for the width of the 
    // whole Graph component 
    Graph graph = new Graph(x -> Math.sin(x/(2*Math.PI))*100+200); 
    JScrollPane jsp = new JScrollPane(graph); 
    f.setContentPane(jsp); 
    f.setSize(800, 600); 
    f.setVisible(true); 
    } 
}